jpa命名查询返回的对象是受管理的,并且更改是持久的。怎么样?

时间:2015-08-12 12:09:15

标签: java jpa

我有一个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");
    }

2 个答案:

答案 0 :(得分:2)

与更新没有什么不同。

在JPA中,您通常不需要显式合并更改,因为JPA实现将跟踪managed objects中已更改的数据(即EntityManager知道的实体,例如它刚刚为你加载了)并确保将这些更改保存到底层数据库。

如果您不希望这样,您可以使用em.detach(Object o);显式分离实体,因此EntityManager不再管理它。之后,您需要执行merge()来更新所有更改。

答案 1 :(得分:2)

从JPQL-Queries返回的实体由EntityManager管理。换句话说,它们是atached,并且不需要合并它们(就像你需要为分离的实体做的那样)。 如果您更改了从查询中返回的实体,并且您有一个打开的事务,则更改将被提交回数据库。

如果您想同时更新大量实体,或者您的实体包含一些具有非常大的序列化占用空间的成员,那么使用JPQL更新可能需要付出性能。