簡單學會Hibernate對象持久化
Hibernate對象持久化技術如何實現呢?本文將教你如何更簡單更加快速的學會Hibernate對象持久化技術。
Hibernate對象持久化類(persistent class)新實例化的對象是瞬時(Transient)的。 我們可通過將瞬時(Transient)對象與session關聯而把它變為持久(Persistent)的。
- DomesticCat fritz = new DomesticCat();
- fritz.setColor(Color.GINGER);
- fritz.setSex('M');
- fritz.setName("Fritz");
- Long generatedId = (Long) sess.save(fritz);
如果Cat的持久化標識(identifier)是generated類型的, 那么該標識(identifier)會自動在save()被調用時產生并分配給cat。 如果Cat的持久化標識(identifier)是assigned類型的,或是一個復合主鍵(composite key), 那么該標識(identifier)應當在調用save()之前手動賦予給cat。 你也可以按照EJB3 early draft中定義的語義,使用persist()替代save()。
此外,你可以用一個重載版本的save()方法。
- DomesticCat pk = new DomesticCat();
- pk.setColor(Color.TABBY);
- pk.setSex('F');
- pk.setName("PK");
- pk.setKittens( new HashSet() );
- pk.addKitten(fritz);
- sess.save( pk, new Long(1234) );
如果你持久化的對象有關聯的對象(associated objects)(例如上例中的kittens集合) 那么對這些對象(譯注:pk和kittens)進行持久化的順序是任意的(也就是說可以先對kittens進行持久化也可以先對pk進行持久化), 除非你在外鍵列上有NOT NULL約束。 Hibernate不會違反外鍵約束,但是如果你用錯誤的順序持久化對象(譯注:在pk持久化之前持久化kitten),那么可能會違反NOT NULL約束。
通常你不會為這些細節煩心,因為你很可能會使用傳播性Hibernate對象持久化(transitive persistence)功能自動保存相關聯那些對象。 這樣連違反NOT NULL約束的情況都不會出現了 - Hibernate會管好所有的事情。 傳播性持久化(transitive persistence)將在本章稍后討論。
【編輯推薦】