0

こんにちは私はこれについて少し混乱しています。タイトルを入力したときに、これを初めて使用するためです。ディーラーマッピングとDealerDataの両方が双方向にあるという点でわかりました。

<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"値をnullにできないスタックトレースが発生することです。つまり、休止状態で変更されていないフィールドも更新しようとしますが、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 セッションが閉じられた場合 (たとえば、Web ページを表示した場合)、エンティティの永続インスタンス (データベース内の表現と識別子値を持つインスタンス) は、分離されたインスタンス (エンティティに接続されていないインスタンス) になります。もうセッション - ただし、引き続き変更して、後続のリクエストで新しいセッションに再接続できます)。

これが役立つことを願っています。

于 2013-03-23T15:36:04.473 に答える