Spring OpenSessionInViewFilter: невозможно сохранить объект - PullRequest
2 голосов
/ 22 января 2010

Я столкнулся с распространенной ошибкой в ​​spring + hibernate, но не могу ее исправить. У меня есть 2 таблицы с отношением один ко многим: каждая Bsc имеет много Ячейка

Моя конфигурация гибернации:

<class name="Bsc" table="bsc">
    <id name="id" column="id">
        <generator class="native" />
    </id>
    <property name="name" />
    <set name="cells">
        <key column="bsc_id" />
        <one-to-many class="Cell" />
    </set>
</class>

    <class name="Cell" table="cell">
    <id name="id" column="id">
        <generator class="native" />
    </id>
    <property name="name" column="name" />
    <many-to-one name="bsc" column="bsc_id" not-null="true" />
</class>

Мой дао:

public class BscDaoImpl extends HibernateDaoSupport implements BscDao {

@Override
public Bsc get(int id) {
    return (Bsc) getHibernateTemplate().get(Bsc.class, id);
}

@Override
public void save(Bsc bsc) {
    getHibernateTemplate().saveOrUpdate(bsc);
}
}

Мой контроллер:

public class BscFormController extends SimpleFormController {

private BscDao bscDao;

public void setBscDao(BscDao bscDao) {
    this.bscDao = bscDao;
}

protected Object formBackingObject(HttpServletRequest request)
        throws Exception {
    String id = request.getParameter("id");

    if (!StringUtils.isBlank(id)) {
        return bscDao.get(new Integer(id));
    }

    return new Bsc();
}

public ModelAndView onSubmit(HttpServletRequest request,
        HttpServletResponse response, Object command, BindException errors)
        throws Exception {

    Bsc bsc = (Bsc) command;
    String success = getSuccessView();

    bscDao.save(bsc);

    return new ModelAndView(success);
}
}

На мой взгляд, у меня есть форма для создания / редактирования информации BSC. Кроме того, я хочу перечислить все ячейки этого BSC, поэтому я настраиваю ленивую загрузку в web.xml

<filter>
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>flushMode</param-name>
        <param-value>AUTO</param-value>
    </init-param>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>mySessionFactory</param-value>
    </init-param>
</filter>

Моя проблема: я не могу сохранить объект, когда нажимаю кнопку Сохранить (он сохраняется нормально, если я удалю конфигурацию OpenSessionInViewFilter).


Я добавил конфигурацию TransactionManager:

<bean id="transactionManager"     class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory"/>
</bean>

Но это все еще не работает. Я что-то пропустил?

Ответы [ 4 ]

2 голосов
/ 09 июля 2014

Я решил, что установил OpenSessionInViewFilter в web.xml

<filter>
        <filter-name>lazyLoadingFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
            <init-param>
            <param-name>flushMode</param-name>
            <param-value>AUTO</param-value>
        </init-param>
</filter>

Привет

1 голос
/ 07 июля 2012

Я здесь, потому что сталкиваюсь с той же проблемой: session.save (что бы то ни было), по-видимому, не сохраняет данные в базе данных. В журнале отладки показано много вариантов выбора, но нет обновлений или вставок.

Вызов session.flush () после сохранения () или обновления () или других методов вынудил обновления быть отправленными в базу данных.

Почему я ДОЛЖЕН сделать это, я еще не понял. Я бы подумал, что в конечном итоге вы захотите, чтобы все обновления помещались в базу данных перед фиксацией.

То, что я пытаюсь выяснить, это то, есть ли способ установить режим сброса так, чтобы перед финальным коммитом была функция flush (). Ничто из того, что я пробовал, пока не работает, и явный вызов сброса все еще необходим.

1 голос
/ 22 января 2010

Вы настраивали TransactionManager в контексте приложения Spring? Кстати, если вы используете JDK5 +, вам лучше использовать аннотации (вы можете уменьшить размер кода в 2 раза)

0 голосов
/ 24 июня 2010

мой текущий конфиг

web.xml

<!-- lazyLoad-->
<filter>
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>mySessionFactory</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

пружинный конфиг

    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean>

<aop:config>
    <aop:advisor pointcut="execution(* vn.com.vhc.cbs.dao.*.*(..))"
        advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="save*" />
        <tx:method name="update*" />
        <tx:method name="remove*" />
        <tx:method name="*" read-only="true" />
    </tx:attributes>
</tx:advice>

надеюсь, что это поможет

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