2014-01-21 66 views
0

我有两个对象谁是双向关系。休眠复制合并后的对象

public class Entity1 extends AbstractEntity implements Serializable{ 
... 
//bi-directional many-to-one association to Entity2 
@OneToMany(mappedBy="entity1", fetch=FetchType.EAGER) 
private Set<Entity2> entityTwos = new HashSet<Entity2>(); 
} 


public class Entity1 extends AbstractEntity implements Serializable{ 
... 
//bi-directional many-to-one association to Entity1 
@ManyToOne 
@JoinColumn(name="N_ENTITY1") 
private Entity1 entity1; 
} 

所以,当我修改ENTITY1和做到这一点:

Entity2 entity2 = new Entity2(); 
      entity2.setValue("I"); 
      entity2.setDate(new Date()); 

entity1.addEntityTwo(entity2); 

Entity2HibernateDao dao = new Entity2HibernateDao(); 
dao.save(entity2); 

getEnitity1Dao().merge(nalog); 

一切都在数据库中还算可以,但我重新启动应用程序后,也有我的JTable的ENTITY1两行。如果我删除:

Entity2HibernateDao dao = new Entity2HibernateDao(); 
dao.save(entity2); 

ENTITY1 ENTITY1的其他属性中刷新数据库中,但当然也有对ENTITY2没有记录。 我也尝试用update()而不是merge(),但它也不起作用。 我是否正确连接Entity1和Entity2的引用?或者是别的什么? 谢谢。

+0

您还需要调用'entity2.setEntity1(entity1);'以正确保存它们。 –

+0

其实,我在方法addEntityTwo()中生成了这段代码,已经有line:entity2.setEntity1(this),所以我认为这不是问题,因为它在数据库中正确添加,但我认为对象在会话中被重复。不管怎么说,还是要谢谢你。 – Alen

+0

你是如何加载它们的?如果你使用的是像'session.list()'这样的列表,将它们包装到'set'中。 –

回答

1

如果您正在使用CriteriafindByCriteria()默认情况下它会造成家长等于数据库的行数的数目。比方说,如果你有一个父母和两个孩子,当你用左连接查询数据库时,你将能够看到两行作为输出。 Hibernate把它们放入pojo中。

无论你需要用你的结果为set

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

会给你想要的结果。