先看下过程
sort.java
public class Sort implements Serializable { private int id; private String name; private int grade;//类别等级 private String descr; private Sort sort;//父类 private List sorts=new ArrayList();//子类 public int getId() { ...... } }
sort.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- DO NOT EDIT: This is a generated file that is synchronized --> <!-- by MyEclipse Hibernate tool integration. --> <!-- Created Sun Jan 29 11:50:19 GMT-08:00 2006 --> <hibernate-mapping package="po"> <class name="Sort" table="t_sort"> <id name="id" column="id" type="int"> <generator class="native"/> </id> <property name="name" column="name" type="string" not-null="true" /> <property name="grade" column="grade" type="int" not-null="true" /> <property name="descr" column="descr" type="string" not-null="true" /> <many-to-one name="sort" class="Sort"> <column name="pid"></column> </many-to-one> <list name="sorts" cascade="all" > <key> <column name="pid"></column> </key> <list-index> <column name="sort_index" ></column> </list-index> <one-to-many class="Sort" /> </list> </class> </hibernate-mapping>
web.xml
<!-- 解决hiberbate lazy问题--> <filter> <filter-name>hibernateFilter</filter-name> <filter-class>util.MyOpenSessionInView</filter-class> </filter> <filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
MyOpenSessionInView.java
public class MyOpenSessionInView extends OpenSessionInViewFilter { @Override protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException { Session session=SessionFactoryUtils.getSession(sessionFactory, true); session.setFlushMode(FlushMode.COMMIT); return session; } protected void closeSession(Session session, SessionFactory factory) { session.flush(); super.closeSession(session, factory); } }
MyOpenSessionInView.java 类是为了解决下面的错误问题。下面的问题的解决办法也有几种,在我的其他转载文章中有提到。
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
在hibernate 删除关联时会出现
eleted object would be re-saved by cascade (remove deleted object from associations)
的异常,结合别人的和自己的经验通常有三种解决的方案:
方法1 删除Set方的cascade:
方法2 解决关联关系后,再删除
方法3 在many-to-one方增加cascade 但值不能是none
以上是我用的第2种方法的一种改进,因为在第二种方法来做的时候依然会报
eleted object would be re-saved by cascade (remove deleted object from associations)
的异常,所以我采取的办法是
public void deleteByid(int sortid) { this.getHibernateTemplate().delete(this.getSort(sortid)); this.getSession().flush(); }
和上面的的
<list name="sorts" cascade="all" >
这样既解决了删除的级联,也消除了上面的异常。
以上纯属个人的尝试,由于经验较少,错误的地方请指教。