Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate时使用ORA-02292_Java_Oracle_Hibernate_Jpa - Fatal编程技术网

Java 使用Hibernate时使用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

我正在尝试实现一个删除函数,但我得到的只是这个ORA-02292错误:

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是用户和汽车之间的连接表吗?