2014-11-23 66 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); 
相关问题