我正在使用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
当我做
时,我必须单独删除p2p2.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被删除了,而事务被回滚,说''被删除的实体被传递给持久存在 请分享您的想法。
答案 0 :(得分:0)
你提到你只想清除连接表,但你在Script-&gt; Parser映射上同时拥有DELETE_ORPHAN和cascade。第一个设置似乎是一个等同于JPA的孤儿删除的休眠选项,这将导致从集合中取消引用的任何实体在数据库中被删除。这将导致示例中的Address1被删除。
当在Person / Script上调用remove时,cascade all选项将强制将remove操作级联到仍由Person / Script引用的任何实体。在第一个示例中,这将导致从数据库中删除/删除Address2。
如果您希望地址1或地址2存活,请删除相应的设置。正如评论中所提到的,您还需要清理引用,因为幸存者将会引用一个已删除的Person / Script实体,这可能会导致您的应用程序出现问题。