2014-11-23 95 views
0
我無法

仍然存在下列實體:Persistense @OneToMany - @ManyToOne

@Entity 
@Table(name="entityOne") 
public class EntityOne implements Serializable { 

    @Id 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy="entityOne") 
    private List<EntityTwo> entities; 

} 

@Entity 
@Table(name="entityTwo") 
public class EntityTwo implements Serializable { 

    @Id 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    @Inject 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="entityOne", referencedColumnName="id") 
    private EntityOne entityOne; 

} 

在EntityOneDAO:

em.merge(entityOne); 

而且只有堅持以EntityOne而不是EntityTwo名單。 ..我如何堅持清單?

感謝所有

回答

0

你需要照顧兩個:

  • 傳遞的持久性(使用級聯)
  • 同步雙向關聯的兩端。

所以EntityOne應該級聯堅持和合併到EntityTwo:

@OneToMany(fetch = FetchType.LAZY, mappedBy="entityOne", cascade = { CascadeType.PERSIST, CascadeType.MERGE}) 
private List<EntityTwo> entities = new ArrayList<>(); 

正如你所看到的,你應該總是初始化集合類,以避免不必要的null檢查。

它總是最好添加以下幫手孩子加入實用的父類(例如EntityOne)

public void addChild(EntityTwo child) { 
    if(child != null) { 
     entities.add(child); 
     child.setEntityOne(this); 
    } 
} 

然後,您只需撥打:

EntityOne entityOne = new EntityOne(); 
entityOne.setProperty("Some Value"); 

EntityTwo entityTwo_1 = new EntityTwo(); 
entityTwo_1.setName("Something"); 

EntityTwo entityTwo_2 = new EntityTwo(); 
entityTwo_2.setName("Something"); 

entityOne.addChild(entityTwo_1); 
entityOne.addChild(entityTwo_2); 

entityManager.persist(entityOne); 

附:

請刪除EntityTwo類中的@Inject註釋。 Entities are not Components。 當你想要插入新實體時,persist比合並更有效率。

0

試試這個:

public class EntityOne implements Serializable { 

    @Id 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy="entityOne", 
       cascade = { CascadeType.ALL}) 
    private List<EntityTwo> entities; 

} 

@Entity 
@Table(name="entityTwo") 
public class EntityTwo implements Serializable { 

    @Id 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    @Inject 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="entityOne", referencedColumnName="id") 
    private EntityOne entityOne; 

} 

您可以閱讀here,有關CascadeType的。

編輯。

0

您應該明確設置每個entityTwo對象的entityOne字段。

這樣的:

entityTwo_1.setEntityOne(entityOne); 
entityTwo_2.setEntityOne(entityOne); 

entityOne.entities.add(entityTwo_1); 
entityOne.entities.add(entityTwo_2); 
em.merge(entityOne); 
相關問題