JPA中的EntityManager merge()

时间:2015-03-21 17:39:40

标签: rest jpa merge entitymanager dto

我正在处理一个使用JPA管理数据库中两个表的应用程序。第一个包含Users,第二个包含Items;一个用户可以拥有多个项目,但一个项目只对应一个用户。这意味着theres是从用户到项目的一对多关系,以及从项目到用户的多对一关系。

我的应用程序是RESTful服务,我目前正在通过Web将DTO转移到显示实体信息的Web应用程序。当我将信息从用户实体转换为用户DTO时,我无法发送所有项目,因为它们可能太多,所以我从用户数据库中获取一个实体并将其转换为没有项目的DTO。

我的问题是,如果我想更新用户的信息,当我将DTO转换回实体时,它将没有任何项目,因此,如何保存更改,保留代表的外键更新信息之前的用户项目?

我知道EntityManager使用merge()方法来更新数据库中的信息,但是,这不会影响我想保留的外键吗?因为我试图保存一个没有物品的实体?

1 个答案:

答案 0 :(得分:1)

您只需从EM检索用户对象, 更新已更改的字段(或全部) 提交事务(如果您管理事务mannualy)

DTO modification = ...
em.getTransaction().begin(); //if it is not container managed
User user = em.find(User.class,modification.getId());
user.setName(modification.getName());
user.setXXX...
em.getTransaction().commit()l //if it is not managed

通常,项目将是延迟加载,因此根本不会检索它们。即使从JPA重新获得的User对象将具有关于它们的完整信息,只要您不修改其itmes内容,这些项目将保持不变。