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

时间:2014-01-08 14:07:51

标签: jpa

我正在使用ManyToMany和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.removeAddress(add1)
 removeAddress(add1) { 
        addColelction.remove(add1) }

它会删除地址条目,并且Hibernate jpa提供程序再次尝试在Address实体上保留并且说“已删除的实体已传递给持久化”并且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;

在Parser方面

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "parsers")
    private Collection<Script> scripts;

数据保存为

Script1 - Parser1
  Script2 - Parser1 

我们的数据模型是Object A有一个toTomany到B,B有oneTomany到Script对象。    说A的集合有(B1,B2,.....)                              B1有(Script1)
                             B2有(Script2)

当我们要删除那个B2对象(我们只做EM.merge(A))时,我们希望删除集合中的特定B2,并且必须删除相关的Script2。 Script2 delete应该单独删除中间条目,但不应删除Parser。       但是Parser1被删除了,而事务被回滚,说''被删除的实体被传递给持久存在         请分享您的想法。

1 个答案:

答案 0 :(得分:0)

你提到你只想清除连接表,但你在Script-&gt; Parser映射上同时拥有DELETE_ORPHAN和cascade。第一个设置似乎是一个等同于JPA的孤儿删除的休眠选项,这将导致从集合中取消引用的任何实体在数据库中被删除。这将导致示例中的Address1被删除。

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

如果您希望地址1或地址2存活,请删除相应的设置。正如评论中所提到的,您还需要清理引用,因为幸存者将会引用一个已删除的Person / Script实体,这可能会导致您的应用程序出现问题。