【发布时间】:2016-11-14 06:40:03
【问题描述】:
我们正在将项目从 Hibernate 3.6.10 升级到 Hibernate 5.2.0,但在迁移时出现错误。我在 StackOverFlow 和 Google 上浏览了很多帖子,但没有找到任何解决方案。
考虑代码参考this website。我只做了数据库连接到 PostgreSQL 数据库。
如果我在添加这些 JAR (ALL Added JAR files screenshot) 后运行此示例,除了休眠 JAR 是 3.6.10-final,它完全可以正常工作。但是,如果我为 hibernate 5 升级进行这些更改:
- 更改 JAR 文件添加为 Hibernate-core-5.2.1-Final.jar
- 将 hibernate3 文件的引用更改为 hibernate5(3 个替换;1 个在 EmployeeDao 导入中,另外 2 个在 applicationContext.xml 中)
它会抛出以下错误:
Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
at org.springframework.orm.hibernate5.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1132)
at org.springframework.orm.hibernate5.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:618)
at org.springframework.orm.hibernate5.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:615)
at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:340)
at org.springframework.orm.hibernate5.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:307)
at org.springframework.orm.hibernate5.HibernateTemplate.save(HibernateTemplate.java:615)
at hibernate.test.EmployeeDao.saveEmployee(EmployeeDao.java:12)
at hibernate.test.InsertTest.main(InsertTest.java:21)
我也进行了这些更改,但遇到了同样的错误: 1. EmployeeDao 评论:
/*HibernateTemplate template;
public void setTemplate(HibernateTemplate template) {
this.template = template;
} */
并扩展 HibernateDaoSupport,使其提供 sessionFactory 设置器。
并将以下代码替换为:
public void saveEmployee(Employee e){
template.save(e);
}
这个:
public void saveEmployee(Employee e){
this.getHibernateTemplate().save(e);
}
经过调试,我知道在 Spring-orm-4.3.1 Jar 提供的 HibernateTemplate 类中抛出了上述错误。
谁能帮我解决这个问题:O。我们已经在这里停留了很长时间。我很感激帮助。
【问题讨论】:
-
以上参考链接:或图 2-i.stack.imgur.com/NwPwl.png 用于图 3-i.stack.imgur.com/Zgx5d.png
-
首先,我不鼓励使用
HibernateTemplate。请参阅此问题stackoverflow.com/questions/4067775/…。阅读接受的答案。您必须从 HibernateTemplate 迁移到 SessionFactory 和声明式事务管理。 -
@TheCoder 感谢您的回复。在这个项目中,它是如此巨大,任何新的实施都可能需要很长时间。我已经完成了提到的线程,他们说它已从 Spring 中删除?但我通过导入
org.springframework.orm.hibernate5.HibernateTemplate使用。无论如何,请尽可能回答上述问题,这就是我所需要的。谢谢。 -
你不应该再使用
HibernateTemplate,它只是为了迁移到普通的SessionFactory。旧的会话工厂确实在找不到会话时自己获得了会话,新版本需要正确的事务设置,因为它在下面使用getCurrentSession。 -
@Harpreet,我明白了。但关键是,您正在从
Hibernate 3.6.10 -> Hibernate 5.2.0迁移。因此,您还必须根据需要迁移大部分代码以使用最新的休眠版本。如果您担心进行大量更改并且只想坚持使用当前代码,那么仅升级版本而不使用任何新功能(会话工厂、声明式事务管理等)是没有意义的。没有冒犯..!