hibernate多对多关联和spring hibernatetemplate不起作用

时间:2010-09-10 07:17:39

标签: mysql hibernate spring many-to-many

我正在使用Spring HibernateTemplate,OpenSessionInViewFilter(实际上是我扩展了这个类并创建了我自己的切换到FLUSH.AUTO模式)和Mysql来实现hibernate多对多关联。但是,当我保存对象时,不会插入相应的多对多表的值。有人可以帮帮我吗?谢谢。

这里是映射xml

<hibernate-mapping>
    <class name="com.intelli.epub.domain.Content" table="CONTENT">
        <id name="id" type="java.lang.Long">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="title" type="java.lang.String">
            <column name="TITLE" />
        </property>
        <property name="text" type="java.lang.String">
            <column name="TEXT" />
        </property>
        <many-to-one name="writer" class="com.intelli.epub.domain.User" fetch="join">
            <column name="WRITER" />
        </many-to-one>
        <property name="createdDate" type="java.util.Date">
            <column name="CREATEDDATE" />
        </property>
        <set name="menus" table="MENU_CONTENT" cascade="all">
            <key column="CONTENT_ID"></key>
            <many-to-many column="MENU_ID" class="com.intelli.epub.domain.Menu"/>
        </set>
    </class>
</hibernate-mapping>
另一个:

<hibernate-mapping>
<class name="com.intelli.epub.domain.Menu" table="MENU">
    <id name="id" type="java.lang.Long">
        <column name="ID" />
        <generator class="native" />
    </id>
    <property name="text" type="java.lang.String">
        <column name="TEXT" />
    </property>
    <set name="contents" table="MENU_CONTENT" inverse="true">
        <key column="MENU_ID"></key>
        <many-to-many column="CONTENT_ID" class="com.intelli.epub.domain.Content"/>
    </set>
</class>

当像这样保存时:

Content content = new Content();
content.setCreatedDate(new Date());
content.setWriter(some user here);
content.setText("some text here");

Menu menu1 = new Menu("menu1");
Menu menu2 = new Menu("menu2");

Set<Menu> menus = new HashSet();
menus.add(menu1);
menus.add(menu2);

content.setMenus(menus);        
contentDao.saveOrUpdate(content);

现在menu1和menu2将保存在MENU表中,但是MENU_CONTENT表没有任何反应; MENU_CONTENT表没有主键字段,而是MENU_ID和CONTENT_ID是主键。我不知道这是不是问题。请帮我。谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。而不是使用Spring HibernateTemplate。我把它包装在这样的常规会话和交易中。

Session session = contentDao.getHibernateTemplate().getSessionFactory().getCurrentSession();    

transaction = session.beginTransaction();

Content content = new Content();
content.setCreatedDate(new Date());
content.setWriter(some user here);
content.setText("some text here");

Menu menu1 = new Menu("menu1");
Menu menu2 = new Menu("menu2");

Set<Menu> menus = new HashSet();
menus.add(menu1);
menus.add(menu2);

content.setMenus(menus);

session.save(content);
transaction.commit(); 
session.close();

这是我的会话过滤器,它继承自OpenSessionInViewFilter

public class SessionFilter extends OpenSessionInViewFilter {

protected Session getSession(SessionFactory sessionFactory)
    throws DataAccessResourceFailureException {
    Session session = super.getSession(sessionFactory);
    session.setFlushMode(FlushMode.AUTO);   
    return session;
}

}

有没有人知道如何处理这个问题而不必费心自己编写会话管理?