0

嗨,我对标题中输入的内容有点困惑,因为我第一次使用这个,好吧,我有经销商映射和经销商数据都是双向的

<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" update="false"/>
    <many-to-one name="dealer" column="idBook_dealer"
        not-null="true" class="sk.bantip.hotel.server.dao.book.Dealer" update="false"/>
    <property name="channel" not-null="false" update="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>

这是经销商映射

<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" cascade="save-update"/>
    <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>

问题是当我尝试更新例如单个 not-null="false"值而不是发生堆栈跟踪时,其他not-null="true"值不能为空,所以这意味着休眠尝试更新未修改的字段,所以我尝试dynamic-update="true"但看起来不起作用仍然尝试重写未修改的值。在某处我读到这不适用于分离对象,仅在会话中,

我不确定我是否通过我的代码使用分离对象或会话,因为我使用了一些我自己不编写的 DAO 方法,因为我对此感到困惑,但也找到select-before-update=true但不知道这一点,你能解释一下在这种情况下是否有用?

所以我要求从休眠状态更新此状态下的值(例如“名称”):

Hibernate: 
update
    book_dealerData 
set
    name=?,       
where
    idBook_dealerData=?

但是 SQL 将它们全部修改如下:

Hibernate: 
update
    book_dealerData 
set
    name=?,
    registration=?,
    taxNumber=?,
    timestamp=?,
    street=?,
    number=?,
    zip=?,
    city=?,
    country=?,
    telephone=?,
    email=? 
where
    idBook_dealerData=?

如果有人对此有更多了解,请留下一个帖子,我将不胜感激,如果需要,我可以提供更多信息(更新方法等),谢谢到目前为止的欢呼

4

1 回答 1

3
  1. dynamic-update="true" 应该与 select-before-update=true 一起使用
  2. 此外,如果您使用 Session.merge(),根据 Hibernate 文档,版本/时间戳列应用作乐观锁定策略,以便 Session.merge() 正确处理对分离实例的修改
  3. 如果一个 Hibernate Session 被关闭(例如你显示一个网页),一个实体的持久实例(在数据库中有一个表示和一个标识符值)将成为一个分离的实例(一个没有附加到一个会话不再 - 但仍然可以在后续请求中修改并重新附加到新会话)。

希望有些帮助。

于 2013-03-23T15:36:04.473 回答