在上例中,程序并沒(méi)有顯式的session.save(child); 那么Hibernate需要知道child究竟是一個(gè)臨時(shí)對(duì)象,還是已經(jīng)在數(shù)據(jù)庫(kù)中有的持久對(duì)象。如果child是一個(gè)新創(chuàng)建的臨時(shí)對(duì)象(本例中就是這種情況),那么Hibernate應(yīng)該自動(dòng)產(chǎn)生session.save(child)這樣的操作,如果child是已經(jīng)在數(shù)據(jù)庫(kù)中有的持久對(duì)象,那么Hibernate應(yīng)該自動(dòng)產(chǎn)生session.update(child)這樣的操作。
因此我們需要暗示一下Hibernate,究竟child對(duì)象應(yīng)該對(duì)它自動(dòng)save還是update。在上例中,顯然我們應(yīng)該暗示Hibernate對(duì)child自動(dòng)save,而不是自動(dòng)update。那么Hibernate如何判斷究竟對(duì)child是save還是update呢?它會(huì)取一下child的主鍵屬性 child.getId() ,這里假設(shè)id是 java.lang.Integer類型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate認(rèn)為child是新的內(nèi)存臨時(shí)對(duì)象,發(fā)送save,如果不相等,那么Hibernate認(rèn)為child是已經(jīng)持久過(guò)的對(duì)象,發(fā)送update。
unsaved-value="null" (默認(rèn)情況,適用于大多數(shù)對(duì)象類型主鍵 Integer/Long/String/...)
當(dāng)Hibernate取一下child的Id,取出來(lái)的是null(在上例中肯定取出來(lái)的是null),和unsaved-value設(shè)定值相等,發(fā)送save(child)
當(dāng)Hibernate取一下child的id,取出來(lái)的不是null,那么和unsaved-value設(shè)定值不相等,發(fā)送update(child)
例如下面的情況: