【发布时间】:2014-11-12 04:46:42
【问题描述】:
我一直在努力使用 JPA(使用 Hibernate)绕过缓存并访问数据库。
我们正在构建一个框架来接收必须保存的实体,但在某些情况下,我需要检查数据库上的当前数据以确定要执行哪种更新(这是业务需求)。
因此,我有一个由用户更新的传入附加实体,但我需要验证其当前数据库信息以确定要执行的业务规则(有时在 JPA 合并()操作之前和有时之后)。
我认为它可以工作的唯一方法是使用实体管理器工厂和这个新的实体管理器创建一个全新的 javax.persistence.EntityManager,执行操作,但我遇到了并发错误。
看(这是在 DAO 的 save() 方法中):
EntityManager newEM = currentEntityManager.getEntityManagerFactory().createEntityManager();
newEM.find(e.getClass(), new Short("1"));
但是当我尝试执行 find() 操作时,我认为 JPA 会尝试获取当前由 currentEntityManager 管理的实例,而不是尝试访问数据库。
javax.persistence.PersistenceException: org.hibernate.exception.LockAcquisitionException: could not load an entity: [com.company.framework.persistence.model.TestEntity]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1694)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1141)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1068)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:334)
at com.sun.proxy.$Proxy32.find(Unknown Source)
你们能帮帮我吗?这是一个 2 周的问题。我真的没有想法。 非常感谢。
【问题讨论】:
-
您是否尝试过不使用代码
currentEntityManager.getEntityManagerFactory()创建一个新的entityManager?您是否使用 FORCE WRITE 作为锁定类型?还是悲观锁? -
@uaiHebert 我正在使用 JPA 默认值,而对于并发控制,我正在使用
@Version字段。currentEntityManager是使用@PersistenceContext注入的 DAO 实体管理器。您建议我以哪种其他方式创建将访问数据库而不是缓存的实体管理器?
标签: java database hibernate caching jpa