我将尽可能具体,所以我想要求修改这个hbm.xml文件的litle帮助
我的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:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:
但不知道使用哪种,我知道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 :(得分:0)
不是级联的强烈倡导者,因为你在HBM.XML中做出的关于是否级联的决定必须在整个应用程序中保持一致,而且你不能确定你想要哪种类型的级联,我我宁愿坚持一个更简单的方法。在您的用例中添加类似的内容是不是一个坏主意:
someDealerDataDAO.persist(dilerko);
就在引发错误的声明之前。
答案 1 :(得分:0)
cascade
主要用于父子关系(例如一对一,多对一,一对多,多对多关联)。
在Parent类的映射文件中定义子关系时,如果指定cascade = "save-update"
,它将如下所示:
每当您保存Parent类的实例时,如果有任何子实例与之关联,它们也会被保存(如果是瞬态)/更新(如果已经保留)。在这种情况下,您将无法获得'TransientObjectException'
。
但是如果您指定了cascade = "refresh"
,它将如下所示:
每当您保存父类的实例时,只会保存该实例。如果任何子类的实例与之关联,则不会保存/更新它们。
话虽如此,如果子类的实例没有持久化到数据库,它只会抛出'TransientObjectException'
。为避免这种情况,您必须在保存父类的实例之前手动保存子类的实例。
使用示例here查看不同的级联选项。