实体管理器merge()问题,id为null

时间:2015-08-01 18:24:38

标签: jpa merge db2

我在将现有父实体与新子实体合并时遇到问题。

以下是该方案:

  1. 创建两个新的父级并在db中保留。
  2. 在父母的表格中,我们将有两个新条目如下
  3. ID = 0,NAME = A
  4. ID = 1,NAME = B
  5. 使用entitymanager.find(),获取ID = 0的父级,并为父级创建一个新子级。
  6. 在孩子的表格中,我们将有以下条目
  7. ID = 0,NAME = A的孩子,PARENT_ID = 0
  8. 使用entitymanager.find(),获取ID = 1的父级,并为父级创建一个新子级。
  9. 使用entitymanager.merge()合并父对象后,新创建的子进程将与ID = 0的现有子进行合并。
  10. 子表中的条目变为ID = 0,CHILD OF PARENT B,PARENT_ID = 0。
  11. 为什么会这样?难道不能为Child创建一个新条目吗?

    父实体:

    public class ParentEntity implements Serializable {
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="PARENT_SEQ")
    @SequenceGenerator(sequenceName="PARENT_SEQ",schema="MURTAZA YAHYA", name = "PARENT_SEQ", initialValue=-1)
    //@GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID",unique=true, nullable=false)
    private Integer id;
    
    @Column(name="NAME" , length=150)
    private String name;
    
    @OneToMany(mappedBy="parentEntity",cascade={CascadeType.MERGE,CascadeType.PERSIST})
    List<ChildEntity> childEntities;
    
    
    public Integer getId() {
        if(id == null)
            return null;
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public List<ChildEntity> getChildEntities() {
        return childEntities;
    }
    
    public void setChildEntities(List<ChildEntity> childEntities) {
        this.childEntities = childEntities;
    }
    }
    

    儿童实体

    public class ChildEntity implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="CHILD_SEQ")
    @SequenceGenerator(sequenceName="CHILD_SEQ",schema="MURTAZA YAHYA", name = "CHILD_SEQ" , initialValue=0)
    //@GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID",unique=true, nullable=false)
    private Integer id;
    
    @Column(name="NAME" , length=150)
    private String name;
    
    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    private ParentEntity parentEntity;
    
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public ParentEntity getParentEntity() {
        return parentEntity;
    }
    
    public void setParentEntity(ParentEntity parentEntity) {
        this.parentEntity = parentEntity;
    }
    
    
    
    
    }
    
    public String AddChildToAnExistingParent(Parent p) {
        // TODO Auto-generated method stub
    
        ParentEntity parent = em.find(ParentEntity.class, p.getId());
    
    
    
    
    
         ChildEntity childEntity = new ChildEntity();
         childEntity.setName("INISYA");
         childEntity.setParentEntity(parent);
    
         List<ChildEntity> list = new ArrayList<ChildEntity>();
         list.add(childEntity);
    
        parent.setChildEntities(list);
    
        em.merge(parent);
        return "Success";
    
    
    
    
    }
    

    任何帮助将不胜感激。谢谢,

1 个答案:

答案 0 :(得分:0)

由于 Parent-&gt; Child 关联使用CascadeType.PERSIST注释,以下代码应解决所述方案。

public String AddChildToAnExistingParent(Parent p) 
{ // TODO Auto-generated method stub
  ParentEntity parent = em.find(ParentEntity.class, p.getId());
  ChildEntity childEntity = new ChildEntity();
  childEntity.setName("INISYA");
  childEntity.setParentEntity(parent);
  parent.getChildEntities().add (childEntity);
  em.persist(parent);// the cascade.persist cause new childs persistence/insert
  return "Success";
}

有关详细信息in this answer说明了EntityManager方法合并 persist 的行为。