2014-01-21 75 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); 

會給你想要的結果。