2012-04-16 5 views
0

私は意図的エンティティは、私は有名な一時的なインスタンスのエラーを取得することを更新しようその後、多対1の関連をフェッチしていないとしてエンティティ(行)を取得:オブジェクト オブジェクト参照に保存されていない一時的なインスタンスを更新多対1で動作しない(一時インスタンス)休止状態のStatelessSession更新?

エラー -

をフラッシュする前に、一時的なインスタンスを保存するが、その「一時的なインスタンスは、」フェッチはなかったので、でも、過渡することはできません

コード:

ProductFamily - Javaコード

public class ProductFamily 
{ 
    private Integer id; 
    private Company company; 
    private String name; 

    //autogenerated getter & setter and constructors 
} 

ProductFamily - のhbm.xml

<hibernate-mapping> 
    <class name="package.ProductFamily" table="product_family" catalog="db"> 
     <id name="id" type="java.lang.Integer"> 
      <column name="id" /> 
      <generator class="identity" /> 
     </id> 
     <many-to-one name="company" class="package.Company" fetch="select"> 
      <column name="company" not-null="true"/> 
     </many-to-one> 
     <property name="name" type="string"> 
      <column name="name" length="64" not-null="true"/> 
     </property> 
    </class> 
</hibernate-mapping> 

会社 - Javaコード

public class Company 
{ 
    private String name; 
    private Set<ProductFamily> productFamilies = new HashSet<ProductFamily>(0); 
    //autogenerated getter & setter and constructors 
} 

会社 - のhbm.xml

<!-- same header as above --> 
<hibernate-mapping> 
    <class name="package.Company" table="company" catalog="db"> 
     <id name="id" type="java.lang.Integer"> 
      <column name="id" /> 
      <generator class="identity" /> 
     </id> 
     <property name="name" type="string"> 
      <column name="name" length="64" not-null="true"/> 
     </property> 
     <set name="productFamilies" table="product_family" inverse="true" lazy="true" fetch="select"> 
      <key> 
       <column name="company" not-null="true"/> 
      </key> 
      <one-to-many class="package.ProductFamily" /> 
     </set> 
    </class> 
</hibernate-mapping> 

テスト方法簡単な検索と変更と更新

public void test() 
{ 
    final StatelessSession session = this.sessionFactory.openStatelessSession(); 

    //get 
    final ProductFamily productFamily = (ProductFamily)session.get(ProductFamily.class, 1); 

    //change primitive property 
    productFamily.setName(productFamily.getName() + "x"); 

    //update 
    final Transaction tr = session.beginTransaction(); 

    try 
    { 
     session.update(productFamily); 
     tr.commit(); 
    } 
    catch (HibernateException e) 
    { 
     logger.severe(e.getMessage() + "\n" + e.getStackTrace()); 
     try 
     { 
      if(tr != null 
       && tr.isActive()) 
       tr.rollback(); 
     } 
     catch (HibernateException eTr) 
     { 
      logger.severe(eTr.getMessage() + "\n" + eTr.getStackTrace()); 
     } 
    } 
    finally 
    { 
     session.close(); 
    } 
} 
+2

コードを表示してください。意図的にアンペアされた関連付け、エンティティの変更および「更新」に関する部分。 –

+0

同じエラーが発生する単純な例を追加しました。 – djmj

答えて

0

問題を再現できません。あなたのコードに基づいて再作成されたプロジェクト。データベース - MySQL、Hibernate 4.1.1。コードは例外なく動作します。

だから、link to my projectです。私は使用したライブラリでそれをパックすることに決めました(問題がライブラリの特定のバージョンで表示されるかどうかを確認できます)。

build.xmlには、事前定義済みの引数(print,createおよびtest)で開始する3つのターゲットが含まれています。

+0

ステートレスセッションも使用しましたか?あなたの調査と時間のために大変ありがとうが、私はエラーまたはバグを発見した。 – djmj

+0

テストメソッドが変更されずにあなたの質問からコピーされました。 –

+0

テストメソッドを1つのアプリケーションとして起動しても、グラスフィッシュを実行しても、同じ方法でもエラーはなくなります。非常に奇妙なことに、すべてのStatelessSessionをSessionに変更して、再び動作します。 – djmj

0

エラーは以前は使用していなかったStatelessSessionにあります。それに言及するのを忘れました。

関連する問題