问题描述
||
我有一个文件夹的父子关系,如下所示:
一个文件夹可以有0-1个父文件夹。
一个文件夹可以有0-n个子文件夹(子文件夹)。
使用休眠模式,我在这些文件夹上调用了“ 0”。
当这样的文件夹没有子文件夹时,一切正常。
但是,当文件夹包含子文件夹时,ѭ0将使子文件夹处于暂态状态(子文件夹的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;
}
}
解决方法
没错
您的集合定义中有cascade = \“ none \”。
http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/html_single/#objectstate-transitive
您需要设置级联= \“保存更新\”。
, 我找到了解决问题的办法。更改我的休眠映射文件中的以下行可解决此问题:
<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\"
可以解决问题。
, 您的代码:
更新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>