Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
Jpa 如何在多个关系中成功执行删除/删除操作?_Jpa - Fatal编程技术网

Jpa 如何在多个关系中成功执行删除/删除操作?

Jpa 如何在多个关系中成功执行删除/删除操作?,jpa,Jpa,我正在使用许多JPA注释,我需要你的宝贵建议。 (假设是人和地址。同一地址指的是更多的人(住在同一地址))。我必须从那个地址删除一个人 Person p1 = new Person(); Person p2 = new Person(); Address add1 = new Address(); p1.add(add1); p2.add(add1); 干得好 add1.add(p1) ; add1.add(p2) ; 然后对合并或持久化iit进行适当映射 p1 -

我正在使用许多JPA注释,我需要你的宝贵建议。 (假设是人和地址。同一地址指的是更多的人(住在同一地址))。我必须从那个地址删除一个人

Person p1 = new Person();
  Person p2 = new Person();
    Address add1 = new Address();

p1.add(add1);
  p2.add(add1);
干得好

add1.add(p1)  ;
  add1.add(p2)  ;
然后对合并或持久化iit进行适当映射

p1 - add1
   p2 - add1 
当我删除p2时,我必须单独删除p2

p2.removeAddress(add1)
 removeAddress(add1) { 
        addColelction.remove(add1) }
发生的情况是,它删除了地址条目,Hibernate jpa提供者再次尝试在地址实体上持久化,并说“已删除的实体已传递到持久化”,然后发生了henc事务回滚。 我对这个问题的更正。映射存在为 在脚本端:

@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
    @JoinTable(name = "XXXX", joinColumns = { @JoinColumn(name = "X1_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "X1_ID", nullable = false, updatable = false) })
    @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private Collection<Parser> parsers;
我们的数据模型是对象A有一个域到B,B有一个域到脚本对象。 假设一个has的集合(B1,B2,…) B1具有(脚本1)
B2有(脚本2)

当我们想要删除B2对象时(我们只执行EM.merge(A)),我们希望必须删除集合中的特定B2,并且必须删除Script2中的相关B2。Script2Delete应该单独删除中间条目,但不应该删除解析器。 但是Parser1被删除,事务被回滚,并说“已删除的实体已传递到persist

请分享您的想法。

您提到您只希望清除联接表,但是您在脚本->解析器映射上设置了DELETE\u ORPHAN和cascade all。第一个设置似乎是一个hibernate选项,相当于JPA的孤立删除,这将导致从集合中取消引用的任何实体在数据库中被删除。这将导致删除示例中的Address1

当对Person/Script调用remove时,cascade all选项将强制将remove操作级联到仍然由Person/Script引用的任何实体。在第一个示例中,这将导致从数据库中删除Address2


如果希望地址1或地址2继续存在,请删除相应的设置。如评论中所述,您还需要清理引用,因为幸存者将引用一个已删除的个人/脚本实体,这可能会在您的应用程序中造成问题。

您是否可以修复格式?您是否可以演示如何删除p2?从映射中,它不应该删除地址,因此会发生其他事情,但请注意,您已经显示了解析器实体集合“解析器”的映射。映射到地址是否不同?注意:必须删除双向关系中的两个引用。您调用p2.removeAddress(add1),但可能也应该调用add1.removePerson(p2),否则add1将继续引用p2,您将得到一个约束错误,或者对象模型将与数据库不同步,从而导致类似的问题。我现在理解了。该错误不是因为地址被删除,而是因为您正在对该地址调用persist。您尚未清理对已删除p2的地址引用,因此它仍然存在,并且您可能已设置了所有级联。这会导致持久化操作级联到已删除的p2,从而导致错误。您必须维护双向关系的两侧以防止此问题。从地址的person集合中删除p2。我对添加到itChris的问题的更正,这里脚本或person都有相同的引用地址对象。但是您提到了“addess1或address2”,您是说两个不同的地址对象吗?我不知道,因为您在Person-address和parser/scripts之间的切换让我感到困惑。我提到的问题仍然存在——在脚本->解析器之间显示的关系上设置了cascade-remove。这意味着,如果删除脚本,它将导致它引用的所有解析器也被删除。您还设置了孤立删除,这意味着如果从该关系中取消引用解析器,该解析器将从数据库中删除。我认为这两个都不是你想要的。
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "parsers")
    private Collection<Script> scripts;
Script1 - Parser1
  Script2 - Parser1