0

我遇到问题仍然存在以下实体:

@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 的列表...我如何保留列表?

谢谢大家

4

3 回答 3

0

你需要照顾好两者:

  • 传递持久性(使用 Cascade)
  • 同步双向关联的两端。

所以EntityOne应该Cascade Persist并合并到EntityTwo:

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

如您所见,您应该始终初始化您的集合类以避免不必要的空检查。

在您的父类中添加以下辅助子添加实用程序总是更好的(例如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 注释。实体不是组件。当您想要插入新实体时,持久化比合并更有效。

于 2014-11-23T15:10:35.813 回答
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;

}

您可以在此处阅读有关 CascadeType 的信息。

编辑。

于 2014-11-23T14:29:35.987 回答
0

您应该明确设置每个entityTwo对象的entityOne字段。

这样:

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

entityOne.entities.add(entityTwo_1);
entityOne.entities.add(entityTwo_2);
em.merge(entityOne);
于 2014-11-23T14:30:16.593 回答