【发布时间】:2011-12-08 19:51:10
【问题描述】:
我在测试中做了一些观察,我发现它们很难理解。我的测试对一个实体执行一些基本的更新(或合并)操作,该实体的一个属性设置为可更新=假。
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(generator = "some-generator")
@Column(name = "EMP_ID", nullable = false)
private Long id;
@Column(name = "EMP_NAME", updatable = false)
private String name;
@Version
@Column(name = "OBJECT_VERSION")
private int version;
public Employee() {
}
public Employee(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
}
注意 - 我使用 Hibernate 作为我的持久性提供程序。
我的观察和疑惑是
上述 Employee 实体的 name 属性设置了 updatable="false"。如果我加载并设置员工实体的名称属性,然后调用 entityManager.merge(employee),则合并不会执行任何更新查询,这是预期的行为,但它也不会引发任何异常。是否可以配置 JPA 以引发运行时异常?
如果使用 JPQL 查询更新 name 属性,而不是调用 entityManager.merge(employee),则查询将成功执行并且 name 属性得到更新。 JPQL 查询行为与 JPA 对象更新不同的技术原因是什么?为什么?
如果使用 JPQL 查询执行更新,则版本号不会增加,尽管有 @Version 注释。我知道可以通过在更新查询中添加“版本化”关键字来实现此行为,但我想了解执行 JPQL 查询时版本属性不会更新的技术原因。
由于 JPQL 是一种面向对象的查询语言(就像 HQL 一样),我认为第 2 点和第 3 点不应该存在技术实现问题。很高兴听到一些专家 cmet 对此进行讨论。谢谢。
【问题讨论】:
-
我在合并时遇到了同样的问题。我没有找到这个问题,所以我再打开一个question。我发现的主要问题是合并返回一个对象,该对象永远不会持续存在,也永远不会持续存在。我正在提交一个关于此的错误。 -阿图尔