如何使用 EntityManager (JPA) 在 DAO 中实现 update() 方法?

Posted

技术标签:

【中文标题】如何使用 EntityManager (JPA) 在 DAO 中实现 update() 方法?【英文标题】:How to implement update () method in DAO using EntityManager (JPA)? 【发布时间】:2010-12-21 00:25:19 【问题描述】:

实现简单更新的标准方法是什么?

示例:我们有电话号码为 NNNNNN 的用户,现在我们要将其设置为 YYYYYY。

@PersistenceContext
private EntityManager em;

public void update (User transientUser) 
    what should be here?

用户实体尽可能简单:

@Entity
@Table (name = "USER")
public class User 

    @Id
    @GeneratedValue
    private Integer id;

    @Column (nullable = false, unique = true)
    private String login;
    private String phone;

    public User ()  

    ... //some setters and getters

【问题讨论】:

其实,这就是我现在所拥有的。但是我还没有测试它,因为配置单元测试的上下文并不容易。 【参考方案1】:

更改属性然后使用EntityManager merge()

http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#merge%28T%29

【讨论】:

【参考方案2】:

根据 JPA 规范,EntityManager#merge() 将返回对 另一个 对象的引用,而不是在对象已加载到当前上下文中时传入的引用。所以,我宁愿返回merge() 的结果并像这样编写update() 方法:

@PersistenceContext
private EntityManager em;

public User update (User transientUser) 
    return em.merge(transientUser);

然后,像这样使用它(跳过初始化部分):

user.setPhone("YYYYYY");
user = dao.update(user);

【讨论】:

以上是关于如何使用 EntityManager (JPA) 在 DAO 中实现 update() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用spring注入JPA EntityManager

如何从 Grails 服务 (JPA + GAE) 中访问 EntityManager

使用Spring时如何注入多个JPA EntityManager(持久化单元)

如何使用 JPA/hibernate EntityManager 和 EJB3.0 实现泛型?

如何使用 spring4+spring-data-jpa(hibernateJpaVendorAdapter)+multidatasource+one entityManager+jpaReposit

如何设置 JPA EntityManager 查询的超时时间