2013-03-06 18 views
0

我會具體,我可以,所以我想只是問了痘痘的幫助,這hml.xml文件修改如何修改休眠的hbm.xml擺脫 - org.hibernate.TransientObjectException:對象引用一個未保存的瞬態的實例

我有這個文件在我的Hibernate映射

<hibernate-mapping> 
<class name="sk.bantip.hotel.server.dao.book.Dealer" table="book_dealer"> 
    <id column="idBook_dealer" name="id" type="java.lang.Long"> 
     <generator class="identity" /> 
    </id> 
    <many-to-one name="domain" column="idMain_domain" 
     not-null="true" class="sk.bantip.hotel.server.dao.main.Domain" /> 
    <many-to-one name="activeData" column="idBook_dealerData" 
     class="sk.bantip.hotel.server.dao.book.DealerData" /> 
    <set name="historyData" inverse="true"> 
     <key column="idBook_dealer" /> 
     <one-to-many class="sk.bantip.hotel.server.dao.book.DealerData" /> 
    </set> 
    <property name="status" not-null="false" /> 
</class> 

,這是協會:

<hibernate-mapping> 
<class name="sk.bantip.hotel.server.dao.book.DealerData" table="book_dealerData"> 
    <id column="idBook_dealerData" name="id" type="java.lang.Long"> 
     <generator class="identity" /> 
    </id> 
    <property name="name" not-null="true"/> 
    <property name="registration" not-null="true"/> 
    <property name="taxNumber" not-null="true"/> 
    <property name="timestamp" not-null="true" /> 
    <property name="authorUserId" column="idAuthor" not-null="true" /> 
    <many-to-one name="dealer" column="idBook_dealer" 
     not-null="true" class="sk.bantip.hotel.server.dao.book.Dealer" /> 
    <property name="channel" not-null="false"> 
     <type name="sk.bantip.core.enums.GenericEnumUserType"> 
      <param name="enumClass">sk.bantip.hotel.server.dao.book.Channel</param> 
      <param name="identifierMethod">getValue</param> 
      <param name="valueOfMethod">getByCode</param> 
     </type> 
    </property> 
    <property name="street" not-null="false" /> 
    <property name="number" not-null="false" /> 
    <property name="zip" not-null="false" /> 
    <property name="city" not-null="false" /> 
    <property name="country" not-null="false" /> 
    <property name="telephone" not-null="false" /> 
    <property name="email" not-null="false" /> 
</class> 

我發現它說使用級聯操作一些導遊,當我得到

org.hibernate.TransientObjectException:對象引用一個未保存的瞬態的實例 - 沖洗之前保存的瞬態的實例:

但不知道哪個用途,我知道cascade =「all」,但我不知道是否會在這種情況下工作, 我使用此方法保存/更新:

public void ajaxNameListener(AjaxBehaviorEvent event) {   
    for(DealerListView diler : dealerList) { 
     if(diler.getDealerId() == getSelectedDealerId()) { 
     diler.setDealerId(selectedDealerId); 
     DealerData dilerko = new DealerData(); 
     dilerko.setName(selectedDealerName); 
     Dealer dealer = BeanFactory 
       .getHotelDAOService(Dealer.class) 
       .findOne(selectedDealerId);  

      dealer.setActiveData(dilerko); 
BeanFactory.getHotelDAOService(Dealer.class).update(dealer);// line 220 - in stacktrace is (at sk.bantip.hotel.web.controller.SalesController.ajaxNameListener(SalesController.java:220))  
    } 
    } 
} 

能有人爲給我基於這種情況建議?我覺得有些改變必須在這些hbm.xml文件中提出,一些級聯操作,但不知道這將是,請離開我一些後,我會很高興的任何幫助 謝謝你,有一個愉快的一天。

編輯:和在子類DealerData我有一個私人屬性,不確定的,但也許將需要在DealerData.hbm.xml中添加此屬性access="field"?因爲這允許Hibernate讀取來自私有變量,而不是公共屬性的值。

回答

0

不是強烈的級聯倡導者,因爲您在HBM.XML中做出的決策是否級聯必須在整個應用程序中保持一致,再加上您並不確定所需的級聯類型,我寧願堅持一個更簡單的方法。在您的用例中添加如下內容會是一個糟糕的主意:

someDealerDataDAO.persist(dilerko); 

就在引發錯誤的語句之前。

+0

感謝後,嗯在這個DAOService我只是一些保存,saveOrUpdate,更新方法,我不寫DAOService方法我只是用這個保存到數據庫,我試着用相同的堆棧跟蹤所有這種方法。 – ViliDuarte1 2013-03-06 10:38:41

0

cascade基本上用於父 - 子關係(例如,一對一,多對一,一對多,多對多關聯)。

雖然在父類的映射文件中定義子關係,如果指定cascade = "save-update",它會像如下:

每當您保存父類的實例,如果有子實例與它相關聯,他們也得到保存(如果是暫時的)/更新(如果已經保存)。在這種情況下,你不會得到'TransientObjectException'

但是,如果你指定cascade = "refresh",它會像如下:

每次保存父類的實例,只有該實例將被保存。如果任何兒童類的實例與之相關,他們不會被保存/更新。在說了這個之後,如果子類的實例沒有被持久化到數據庫,它將簡單地拋出'TransientObjectException'。爲避免這種情況,您必須在保存父類的實例之前手動保存子類的實例。

查看示例here的不同級聯選項。

+0

啊哈,好吧謝謝,但我在這種情況下,當我的DealerData和DealerData都在他們的hbm.xml文件標籤,他們每個人互相引用,例如我希望更新屬性的DealerData,所以哪些級聯操作是適合在這種情況下? – ViliDuarte1 2013-03-06 11:38:21

+0

你的情況被稱爲「雙向關係」。級聯的規則是相同的。如果在兩個映射文件中都指定了'cascade =「save-update」',則它將如下工作:如果保存'Dealer',則相關的'DealerData'也將被保存。如果您保存'DealerData',則相關的'Dealer'也將被保存。它完全取決於你指定'cascade'的位置。 – RAS 2013-03-06 11:55:51

+0

aha是的理解再次感謝你你幫我澄清這一點,所以不是我需要在兩個映射文件中指定級聯,如果我只想在我的DealerData類中進行保存/更新,我只需將它放入DealerData.hbm.xml中吧?因爲我已經聲明cascade =「在這兩個文件中保存更新」,我得到的DealerData中的外鍵約束違反異常 - 「列id_dealer不能爲空」當我想從DealerData.class更新某些屬性,或者這個異常不要依賴於此,我不確定 – ViliDuarte1 2013-03-06 12:15:17

相關問題