当前位置: 首页 > 知识库问答 >
问题:

如何修改hibernate hbm。xml来摆脱-org。冬眠TransientObjectException:对象引用未保存的临时实例

夏飞掣
2023-03-14

我会尽可能具体,所以我想只是要求litle帮助修改这个hbm.xml文件

我的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.瞬态ObjectException:对象引用一个未保存的瞬态实例-在刷新之前保存瞬态实例:

但是我不知道使用哪种方法,我知道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中添加此属性access=“field”。哈佛商学院。xml?因为这允许Hibernate从私有变量而不是公共属性读取值。

共有2个答案

岑元徽
2023-03-14

cascade基本上用于父子关系(例如一对一、多对一、一对多、多对多关联)。

在父类的映射文件中定义子关系时,如果指定cascade=“save update”,则其工作原理如下:

每当您保存父类的实例时,如果有任何子实例与之关联,它们也会被保存(如果是瞬态的)/更新(如果已经持久化)。在这种情况下,您将不会获得'瞬态对象异常'

但是如果您指定了cascade="刷新",它的工作方式如下:

每当您保存父类的实例时,只会保存该实例。如果任何子类的实例与之关联,它们将不会被保存/更新。

话虽如此,如果子类的实例没有持久化到数据库中,它只会抛出“TransientObjectException”。为了避免这种情况,必须在保存父类实例之前手动保存子类实例。

通过这里的示例查看不同的级联选项。

窦英武
2023-03-14

不是像你在哈佛商学院所做的决定那样强烈支持级联。XML是否级联必须在整个应用程序中保持一致,再加上您不太确定想要哪种类型的级联,我宁愿使用更简单的方法。在您的用例中添加以下内容是否是一个坏主意:

someDealerDataDAO.persist(dilerko);

就在引发错误的陈述之前。

 类似资料: