0

できる限り具体的に説明しますので、この hbm.xml ファイルの変更について少しだけ助けを求めたいと思います

休止状態のマッピングにこのファイルがあります

<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 はパブリック プロパティではなくプライベート変数から値を読み取ることができるようになります。

4

2 に答える 2

0

カスケードの強力な支持者ではありません。カスケードするかどうかのHBM.XMLでの決定は、アプリケーション全体で一貫している必要があります。さらに、どのタイプのカスケードが必要かわからないので、私はむしろより単純なアプローチに固執します。次のようなものを追加することは、ユースケースでは悪い考えですか?

someDealerDataDAO.persist(dilerko);

エラーを引き起こすステートメントの直前。

于 2013-03-06T10:34:05.743 に答える
0

cascade基本的に親子関係(1対1、多対1、1対多、多対多の関連付けなど)で使用されます。

親クラスのマッピングファイルで子関係を定義する際に を指定するcascade = "save-update"と、以下のように動作します。

親クラスのインスタンスを保存するときはいつでも、子インスタンスがそれに関連付けられている場合、それらも保存されます (一時的な場合) / 更新されます (既に永続化されている場合)。この場合、 は取得できません'TransientObjectException'

ただし、 を指定cascade = "refresh"した場合は、次のように動作します。

親クラスのインスタンスを保存すると、そのインスタンスだけが保存されます。子クラスのインスタンスがそれに関連付けられている場合、それらは保存/更新されません。

そうは言っても、子クラスのインスタンスがデータベースに永続化されていない場合は、単に'TransientObjectException'. これを回避するには、親クラスのインスタンスを保存する前に、子クラスのインスタンスを手動で保存する必要があります。

ここの例でさまざまなカスケード オプションを見てください。

于 2013-03-06T11:24:00.233 に答える