我有一个Entity(比如Employee)和一个find方法,它使用TypedQuery来执行命名查询并返回Employee行。当更改此返回的Employee实例的属性时,它将保持不变。
我试图找出这背后的JPA概念,这与更新有何不同。如果db中现有行的几个列值需要更改,那么更新这样的单行是否合适。 寻找解释这一点的JPA概念的指针。
以下是代码片段。
@Entity
@NamedQueries({
@NamedQuery(name = "Employee.findInActiveEmployee", query = "SELECT e FROM Employee e" +
"WHERE some_prop = :something")
})
public class Employee implements Serializable {
@Id
@NotNull
@Column(name = "id")
private String id;
@Column(name = "name")
private int name;
//so and so properties
//getter and setters
}
取景器方法
TypedQuery<Employee> query = getEntityManager().
createNamedQuery("Employee.findInActiveEmployee", Employee.class);
query.setParameter("someproperty", "somevalue");
try {
return query.getSingleResult();
} catch (NoResultException e) {
throw new NoSuchObjectException("somevalue");
}
答案 0 :(得分:2)
与更新没有什么不同。
在JPA中,您通常不需要显式合并更改,因为JPA实现将跟踪managed objects
中已更改的数据(即EntityManager
知道的实体,例如它刚刚为你加载了)并确保将这些更改保存到底层数据库。
如果您不希望这样,您可以使用em.detach(Object o);
显式分离实体,因此EntityManager不再管理它。之后,您需要执行merge()
来更新所有更改。
答案 1 :(得分:2)
从JPQL-Queries返回的实体由EntityManager管理。换句话说,它们是atached,并且不需要合并它们(就像你需要为分离的实体做的那样)。 如果您更改了从查询中返回的实体,并且您有一个打开的事务,则更改将被提交回数据库。
如果您想同时更新大量实体,或者您的实体包含一些具有非常大的序列化占用空间的成员,那么使用JPQL更新可能需要付出性能。