使用orphanRemoval = true的JPA2懒惰子集合删除'未获取'的子节点

时间:2011-07-12 22:13:02

标签: java jpa-2.0 openjpa

我有一个父实体拥有(通过mappedBy)一个FetchType.LAZY Set< Child>使用orphanDelete = true。

客户端可以通过父级的集合getter愉快地添加和删除子行,并且在em.merge(父级)之后正确提交他们的更改。

但是,如果客户端合并父项而不访问子集合,则父项的提交中将删除所有子行。

在OpenJPA 2.1.0和2.1.1-20110610.205956-18快照二进制文件中表现出相同的行为。

任何指针都会受到赞赏。

举例说明:

@Entity
public class Parent{

    @Column
    private String name;

    @OneToMany(mappedBy="parent", fetch=LAZY, cascade = ALL, orphanRemoval=true)
    private Set<Child> children;

    public String getName(){return name;}
    public void setName(String name){this.name=name;}

    public Set<Child> getChildren(){
        return children;
    }
}

@Entity
public class Child{

    @ManyToOne(optional = false, targetEntity = Parent.class)
    @JoinColumn(name="parent_id", nullable=false)
    private Parent parent;

}

两个实体都声明了@Id和@Version属性,并实现了相应的hashCode,equals和compareTo方法。

以下客户端代码完美运行,更新了parent.name,插入了1个子项,删除了1个子项

EntityTransaction eTx=em.getTransaction();
eTx.begin();

Parent par=em.find(Parent.class, parId);
    //PersistenceUnitUtil.isLoaded(par) returns true
    //PersistenceUnitUtil.isLoaded(par, "children") returns false
Collection<Child> children=par.getChildren();
    //PersistenceUnitUtil.isLoaded(par, "children") returns true
Child child = children.iterator().next();
par.getChildren().remove(child);
par.getChildren().add(new Child(par, "I'm New"));
par.setName("I am Updated");
par=em.merge(par);

eTx.commit();

以下代码将为每个父项的子项发出删除命令:

EntityTransaction eTx=em.getTransaction();
eTx.begin();

Parent par=em.find(Parent.class, parId);
   //PersistenceUnitUtil.isLoaded(par) here returns true, and
   //PersistenceUnitUtil.isLoaded(par, "children") returns false
par.setName("I am Updated");
par=em.merge(par);
eTx.commit();

1 个答案:

答案 0 :(得分:0)

只是不要打电话给合并。没有必要。在事务范围内,除非对象已分离,否则对该事务中查找的对象所做的更改将被保留。