hibernate无状态会话更新,多对一不工作(临时实例)?
当我检索一个实体(行)时,有一个故意未蚀刻的多对一关联,然后尝试更新该实体,我得到了著名的瞬态实例错误: 更新对象时出错 对象引用未保存的临时实例-在刷新之前保存临时实例 但那个“瞬态实例”从未被获取,因此甚至不能是瞬态的 代码: ProductFamily-java代码hibernate无状态会话更新,多对一不工作(临时实例)?,hibernate,foreign-keys,fetch,transient,Hibernate,Foreign Keys,Fetch,Transient,当我检索一个实体(行)时,有一个故意未蚀刻的多对一关联,然后尝试更新该实体,我得到了著名的瞬态实例错误: 更新对象时出错 对象引用未保存的临时实例-在刷新之前保存临时实例 但那个“瞬态实例”从未被获取,因此甚至不能是瞬态的 代码: ProductFamily-java代码 public class ProductFamily { private Integer id; private Company company; private String name; /
public class ProductFamily
{
private Integer id;
private Company company;
private String name;
//autogenerated getter & setter and constructors
}
public class Company
{
private String name;
private Set<ProductFamily> productFamilies = new HashSet<ProductFamily>(0);
//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>
我不能重现这个问题。根据您的代码重新创建项目。数据库-MySQL,Hibernate4.1.1。代码毫无例外地工作 所以,这里是。我决定将它与我使用的库打包(这样您就可以检查特定版本的库是否出现问题)
build.xml
包含3个以预定义参数开始的目标(print
、create
和test
)。错误在我以前没有使用过的无状态会话中。忘了提了。请出示您的代码。关于故意取消关联、修改实体和“更新”的部分。我添加了一个仍然产生相同错误的简化示例。您是否也使用了无状态会话?非常感谢您的调查和时间,但我发现了错误或bug。测试方法是从您的问题中复制的,没有任何更改。即使更新到hibernate 4.1.2,仍然是相同的错误,无论我是作为单个应用程序启动测试方法还是运行glassfish。非常奇怪,我把所有的无状态会话都改成了会话,它又能工作了。你可以试着调试到hibernate源代码中。至少你会发现到底哪里出了问题。
<!-- 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();
}
}