Java 使用Hibernate时使用ORA-02292
我正在尝试实现一个删除函数,但我得到的只是这个ORA-02292错误:Java 使用Hibernate时使用ORA-02292,java,oracle,hibernate,jpa,Java,Oracle,Hibernate,Jpa,我正在尝试实现一个删除函数,但我得到的只是这个ORA-02292错误: Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-02292: Integritäts-Constraint (VDMA.FK892DE8B473F40868) verletzt - untergeordneter Datensatz gefunden at oracle.jdbc.driver.T4CTTIoer.processEr
Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-02292: Integritäts-Constraint (VDMA.FK892DE8B473F40868) verletzt - untergeordneter Datensatz gefunden
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
我有一个实体(MainEntity),它与其子实体具有n:m关系
例如:一个用户可以有多辆车,每辆车可以由不同的用户驾驶。
当用户被删除时,我希望用户和汽车之间的关联也被删除。这就是为什么我认为我可以做到以下几点:
用户实体
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "user_car", joinColumns = {@JoinColumn(name = DATABASE_COLUMN_ID, nullable = false, updatable = false) }, inverseJoinColumns = {@JoinColumn(name = DATABASE_COLUMN_TYPE_ID,
nullable = true, updatable = false) })
private Set<UserCar> userCars;
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "userCars")
private Set<User> users;
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name=“user\u car”,joinColumns={@JoinColumn(name=DATABASE\u COLUMN\u ID,nullable=false,updateable=false)},inverseJoinColumns={@JoinColumn(name=DATABASE\u COLUMN\u TYPE\u ID),
nullable=true,updateable=false)})
私家车;
汽车实体
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "user_car", joinColumns = {@JoinColumn(name = DATABASE_COLUMN_ID, nullable = false, updatable = false) }, inverseJoinColumns = {@JoinColumn(name = DATABASE_COLUMN_TYPE_ID,
nullable = true, updatable = false) })
private Set<UserCar> userCars;
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "userCars")
private Set<User> users;
@manytomy(fetch=FetchType.LAZY,mappedBy=“userCars”)
私人用户;
结果是:
表被创建,数据被持久化——一切正常。
除了删除条目:只要我尝试删除一个用户,并且该用户有一辆车(因此有一个User:car关系),我就会得到上面显示的错误
如果用户没有任何汽车,我可以删除他而不产生任何问题。因此,问题一定是USER_CAR表中的约束。请确保删除子记录,添加子记录将有助于删除
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL,orphanRemoval=true)
@JoinTable(name=“user\u car”,joinColumns={@JoinColumn(name=DATABASE\u COLUMN\u ID,nullable=false,updateable=false)},inverseJoinColumns={@JoinColumn(name=DATABASE\u COLUMN\u TYPE\u ID),
nullable=true,updateable=false)})
私家车
这将删除与用户关联的所有车辆。清除
userCars
:
user.getUserCars().clear()
这将打破用户和相关车辆之间的关联(它将从连接表中删除相应的记录)
另外,您不希望在多对多关联上使用
CascadeType.ALL
,因为它隐式包含CascadeType.REMOVE
。使用它意味着删除也将级联到汽车,尽管还有其他用户与这些汽车关联。我可以看到我可以将该属性添加到一个多个关系中,但不是很多关系中。。。有其他选择吗?抱歉,我没有注意到它是ManyToMany,只有在源端具有单个基数的关系才能启用孤立删除,这就是为什么在“@OneToOne”和“@OneToMany”关系批注上定义了孤立删除选项,但在“@ManyToOne”或“@ManyToMany”上都没有定义注释。在删除用户之前,有任何针对多个的解决方案吗?注意,Hari和aksamit已经偶然发现了:为什么您有一个带有隐式级联类型的多个
。删除
(在cascade=CascadeType.ALL
中)CascadeType.REMOVE
仅适用于OneBox
关系,因为它意味着在删除父实体时删除引用的实体。@TobiasLiefke您是对的,谢谢!我没有注意到OP使用了这个。我编辑了我的答案,也包括了这个警告。@Dragan:那么哪个CasecadeType是正确的呢?哪一个适合您的用例。要包含除REMOVE
之外的所有内容,可以指定cascade={CascadeType.PERSIST、CascadeType.MERGE、CascadeType.REFRESH、CascadeType.DETACH}
。但排除那些你不会使用的<代码>持久化和合并
在大多数用例中通常是足够的代码>?它是一辆映射到类似car
table的汽车,而USER\u car是用户和汽车之间的连接表吗?