гибернация ассоциация многих ко многим и весенняя гибернация не работает - PullRequest
0 голосов
/ 10 сентября 2010

Я использую Spring HibernateTemplate, OpenSessionInViewFilter (на самом деле я расширил этот класс и создал свой собственный, чтобы переключиться в режим FLUSH.AUTO) и Mysql для реализации гибернации связи многих со многими.Однако, когда я сохраняю объект, соответствующие значения таблицы многие-ко-многим не вставляются.Кто-нибудь может мне помочь?Спасибо.

здесь приведено сопоставление 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 голосов
/ 10 сентября 2010

Я нашел решение.Вместо использования 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;
}

}

Кто-нибудь знаетспособ справиться с этим, не потрудившись написать управление сессиями сам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...