java - 在同一个事务中创建和查找一个 jpa 实体?

标签 java hibernate jpa jboss7.x

我使用的是 JBoss 7.1.1 和它附带的默认 Hibernate 实现 (4.0.1)。 我有一个消息驱动的 bean,它在同一个事务中创建一个实体并使用实体管理器持久化它。之后(仍然是同一个事务)我找到新创建的实体并尝试使用实体管理器通过 PESSIMISTIC_WRITE 锁定它,但我得到了一个 OptimisticLockException。它的根如下:

Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [some.package.name.EntityName#aaa1a1a0-d568-11e1-9f99-d5a00a0a12b6]
    at org.hibernate.dialect.lock.PessimisticWriteSelectLockingStrategy.lock(PessimisticWriteSelectLockingStrategy.java:95)
    at org.hibernate.persister.entity.AbstractEntityPersister.lock(AbstractEntityPersister.java:1785)
    at org.hibernate.event.internal.AbstractLockUpgradeEventListener.upgradeLock(AbstractLockUpgradeEventListener.java:99)
    at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:85)
    at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:693)
    at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:686)
    at org.hibernate.internal.SessionImpl.access$1100(SessionImpl.java:160)
    at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2164)
    at org.hibernate.ejb.AbstractEntityManagerImpl.lock(AbstractEntityManagerImpl.java:1093)
    ... 202 more

为什么我无法查找新创建的实体有什么想法吗?另外,我怎样才能让它在创建后立即可供搜索?使用 EM 的合并方法似乎没有帮助......

最佳答案

我对您的问题的理解是,在您的消息驱动 bean 的事务中,您正在执行以下操作:

1. Create entityA
2. Persist entityA
3. entityB = find entityA
4. lock(entityB, PESSIMISTIC_WRITE)

第 4 步抛出异常。

我认为 Hibernate 可能没有刷新 2 和 3 之间的持久性,所以此时 A(和 B)的版本为 0。Hibernate 然后在 lock() 开始时刷新 A 的持久性,这意味着 B 现在有一个陈旧的版本。

您可以尝试在查找之前刷新持久化(因此 entityManager.flush() 在 2 之后)。

或者您应该能够跳过查找,因为 entityManager.persist(entityA) 使 entityA 成为托管对象,因此以下顺序可能有效:

1. Create entityA
2. Persist entityA
3. lock(entityA, PESSIMISTIC_WRITE)

关于java - 在同一个事务中创建和查找一个 jpa 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11629513/

相关文章:

java - ANTLR 找不到计数器符号

java - 多级继承中的多个抽象类

java - NoSuchBeanDefinitionException : No qualifying bean of type (JpaRepository and Java Config)

java - 如何持久化 java.util.Currency 之类的类?

java - JPA:防止单向一对多映射中的级联更新

hibernate - JPQL 和元组列表作为 SELECT IN 语句的参数

java - @Valid 对象图验证不适用于 JPA 和 TraversableResolver

java - 使用 P2 降级 RCP 应用程序

java - 为什么嵌套 Java 循环执行得非常快

java - 为什么 Hazelcast 在 CleanupService.registerCache 处具有固定的清理缓存延迟(60 秒)