Spring OpenSessionInViewFilter:无法保存对象

时间:2010-01-22 02:40:11

标签: hibernate spring

我遇到了spring + hibernate的常见错误,但无法修复它。我有2个表与一对多关系:每个 Bsc 有很多单元

我的hibernate配置:

<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 config:

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

但它仍然无效。我错过了什么吗?

4 个答案:

答案 0 :(得分:2)

我已经解决了在web.xml中设置OpenSessionInViewFilter的问题

<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 :(得分:1)

您是否在Spring应用程序上下文中配置了TransactionManager? 顺便说一下,如果您使用的是JDK5 +,最好使用注释(可以将代码大小减少2倍)

答案 2 :(得分:1)

我在这里是因为我遇到了同样的问题:session.save(无论如何)似乎没有将数据实际持久存储到数据库中。调试日志记录显示了大量选择,但没有更新或插入。

在save()或update()或其他方法之后调用session.flush()强制将更新推送到数据库。

为什么我要这样做是我还没想到的。我本以为最终你会希望所有更新都在提交之前进入数据库。

我想弄清楚的是,是否有办法设置flushmode,以便在最终提交之前有一个flush()。我还没有尝试过任何工作,仍然需要明确的同花顺电话。

答案 3 :(得分:0)

我当前的配置

<强>的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>

spring config

    <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>

希望这个帮助