我在hibernate项目上做了几个测试用例:
当我打电话
EntityManager em = getEntityManager();
em.find(Foo.class, 1)
我按照预期得到了实体,但是当我调用时:
EntityManager em = getEntityManager();
em.find(Foo.class, 1, LockModeType.WRITE)
我变空了。另外,当我做:
EntityManager em = getEntityManager();
Foo foo = em.find(Foo.class, 1)
em.lock(foo, LockModeType.WRITE);
我正在获取该对象,并且它正如我所期望的那样工作。
编辑:
@javax.persistence.Entity
@Table(name="foo")
static class Foo implements Serializable {
@Id private Integer id;
private String code;
@Version private Integer version;
public Foo() {
}
........
}
我的依赖项:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.5.5-Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.0-Beta-2</version>
</dependency>
<dependency>
<groupId>jboss</groupId>
<artifactId>jboss</artifactId>
<version>4.2.3.GA</version>
<scope>provided</scope>
</dependency>
你能给我一点意见吗?
答案 0 :(得分:2)
我无法重现。使用以下实体:
@Entity
public class Foo {
@Id private Integer id;
private String name;
@Version private Integer version;
...
}
以下代码段正常运作:
EntityManager em = getEntityManager();
Foo foo = em.find(Foo.class, 1, LockModeType.WRITE);
assertNotNull(foo);
foo.setName("baz");
em.flush();
使用乐观锁定读取和更新实体,版本更新:
10:21:42.223 [main] DEBUG org.hibernate.SQL - select foo0_.id as id25_0_, foo0_.name as name25_0_, foo0_.version as version25_0_ from Foo foo0_ where foo0_.id=? 10:21:42.225 [main] TRACE org.hibernate.type.LongType - binding '1' to parameter: 1 10:21:42.229 [main] TRACE org.hibernate.type.StringType - returning 'bar' as column: name25_0_ 10:21:42.230 [main] TRACE org.hibernate.type.LongType - returning '0' as column: version25_0_ 10:21:42.246 [main] DEBUG org.hibernate.SQL - update Foo set name=?, version=? where id=? and version=? 10:21:42.248 [main] TRACE org.hibernate.type.StringType - binding 'baz' to parameter: 1 10:21:42.249 [main] TRACE org.hibernate.type.LongType - binding '1' to parameter: 2 10:21:42.249 [main] TRACE org.hibernate.type.LongType - binding '1' to parameter: 3 10:21:42.250 [main] TRACE org.hibernate.type.LongType - binding '0' to parameter: 4
使用Hibernate 3.5.5-Final测试。
你不使用相同版本(由于像HHH-5032这样的问题我明确地提到过它)。请尝试使用以下依赖项(您不需要指定对hibernate-core
工件的依赖关系,您将获得它的传递性):
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.5-Final</version>
</dependency>
<dependency>
<groupId>jboss</groupId>
<artifactId>jboss</artifactId>
<version>4.2.3.GA</version>
<scope>provided</scope>
</dependency>