0

意図的にフェッチされていない多対 1 の関連付けを持つエンティティ (行) を取得し、そのエンティティを更新しようとすると、有名な一時的なインスタンス エラーが発生します。

オブジェクト オブジェクトの更新中にエラーが発生し、保存されていない一時インスタンスを参照しています - フラッシュする前に一時インスタンスを保存してください

しかし、その「一時的なインスタンス」はフェッチされていないため、一時的でさえありません

コード:

ProductFamily - Java コード

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

    //autogenerated getter & setter and constructors
}

製品ファミリ - 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();
    }
}
4

2 に答える 2

0

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

だから、ここに私のプロジェクトへのリンクがあります。使用したライブラリをパックすることにしました(特定のバージョンのライブラリで問題が発生するかどうかを確認できます)。

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

于 2012-04-17T17:06:56.680 に答える
0

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

于 2012-04-18T01:14:37.677 に答える