Hibernate的了Session.update(OBJ)方法使子对象的瞬态(在父/子关系)
我的文件夹对家长/孩子的关系,这看起来是这样的:Hibernate的了Session.update(OBJ)方法使子对象的瞬态(在父/子关系)
一个文件夹可以有0-1父文件夹。 一个文件夹可以有0-n个子文件夹(子文件夹)。
使用Hibernate,我在这些文件夹上调用session.update(folder)
。
当这样的文件夹没有子文件夹时,一切正常。
但是当一个文件夹包含子文件夹时,session.update(folder)
会使子文件夹瞬变(子文件夹的ID从4变为0!)。
这怎么可能?
这里是我的映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="test.Folder" table="FOLDERS">
<id name="id" type="long" access="field">
<column name="FOLDER_ID" />
<generator class="native" />
</id>
<set name="childFolders" table="FOLDERS" lazy="false" inverse="true" cascade="none">
<key column="PARENT_FOLDER_ID" not-null="false"></key>
<one-to-many class="test.Folder" />
</set>
<many-to-one name="parentFolder" column="PARENT_FOLDER_ID" />
<property name="name" column="FOLDER_NAME" />
<property name="rootFolder" column="IS_ROOT_FOLDER" type="boolean" not-null="true" />
<property name="path" column="FOLDER_PATH" />
<property name="type" column="FOLDER_TYPE" />
<property name="fullPath" column="FULL_PATH" unique="true" not-null="true" />
</class>
</hibernate-mapping>
更新:下面是我用更新的文件夹的Java代码:
public class DatabaseController{
private SessionFactory sessionFactory = null;
public void updateFolder(Folder folder){
Session session = null;
Transaction transaction = null;
try {
session = getSession();
transaction = session.beginTransaction();
session.update(folder);
transaction.commit();
} catch (Exception e) {
rollback(transaction);
closeSession();
} finally {
closeSession();
}
}
/*
* Returns the Hibernate session
*/
private Session getSession() {
if (_session == null) {
_session = getSessionFactory().getCurrentSession();
}
if (_session.isOpen() == false) {
_session = getSessionFactory().openSession();
}
return _session;
}
/**
* Returns the session factory
*
* @return The session factory
*/
public SessionFactory getSessionFactory() {
return sessionFactory;
}
}
我找到了一个解决问题的办法。更改以下行中我的Hibernate映射文件解决了该问题:
<set name="childFolders" table="FOLDERS" inverse="true" cascade="none">
<key column="PARENT_FOLDER_ID"></key>
<one-to-many class="test.Folder" />
</set>
我认为,在这里卸下not-null="false"
为重点的伎俩。
这是正确的
你有级联=“无”在您的设置定义。
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-transitive
您需要设置级联= “保存更新”。
不,我之前设置过。如果我这样做,Hibernate首先对父文件夹执行UPDATE,然后将id = 0设置为子文件夹。然后,它为子文件夹(而不是UPDATE)执行INSERT,因为id = 0,这将导致JDBC异常(重复条目),因为子文件夹已经存在于数据库中。 – Timo 2011-06-01 21:24:01
代码: 更新2
<set name="childFolders" table="FOLDERS" lazy="false" inverse="true" cascade="none">
<key column="PARENT_FOLDER_ID" not-null="false"></key>
<one-to-many class="test.Folder" /> // **this should point to child table not itself**
</set>
你给错了关系模型 我的代码:
<set cascade="all, delete-orphan" name="childTable" order-by="param" inverse="true">
<key>
<column name="p_id"/>
</key>
<one-to-many class="com.a.data.ChildTable"/>
</set>
请添加您用来更新实体的java代码。 – Augusto 2011-05-30 12:55:37
@Augusto我添加了代码 – Timo 2011-06-01 21:24:41