2013-03-06 20 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

相关问题