JPA 中的 EntityManager merge()
EntityManager merge() in JPA
我正在开发一个使用 JPA 管理数据库中两个表的应用程序。第一个包含用户,第二个包含项目;一个用户可以有很多项目,但一个项目只对应一个用户。这意味着用户与项目之间存在一对多关系,项目与用户之间存在多对一关系。
我的应用程序是一个 RESTful 服务,我目前正在通过 Web 将 DTO 传输到显示实体信息的 Web 应用程序。当我将信息从用户实体转换为用户 DTO 时,我无法发送它的所有项目,因为它们可能太多,所以我从用户数据库中取出一个实体并将其转换为没有项目的 DTO。
我的问题是,如果我想更新用户的信息,当我将 DTO 转换回实体时,它不会有任何项目,那么,我如何保存更改以保留代表用户的外键更新其信息之前的项目?
我知道 EntityManager 使用 merge() 方法来更新数据库中的信息,但是,这不会影响我想要保留的外键吗?因为我正在尝试保存没有项目的实体?
您只需从 EM 中检索一个用户对象,
更新已更改(或全部)的字段
提交事务(如果您手动管理事务)
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 检索到的用户对象将拥有关于它们的完整信息,只要您不修改其 items 内容,这些项目将保持不变。
我正在开发一个使用 JPA 管理数据库中两个表的应用程序。第一个包含用户,第二个包含项目;一个用户可以有很多项目,但一个项目只对应一个用户。这意味着用户与项目之间存在一对多关系,项目与用户之间存在多对一关系。
我的应用程序是一个 RESTful 服务,我目前正在通过 Web 将 DTO 传输到显示实体信息的 Web 应用程序。当我将信息从用户实体转换为用户 DTO 时,我无法发送它的所有项目,因为它们可能太多,所以我从用户数据库中取出一个实体并将其转换为没有项目的 DTO。
我的问题是,如果我想更新用户的信息,当我将 DTO 转换回实体时,它不会有任何项目,那么,我如何保存更改以保留代表用户的外键更新其信息之前的项目?
我知道 EntityManager 使用 merge() 方法来更新数据库中的信息,但是,这不会影响我想要保留的外键吗?因为我正在尝试保存没有项目的实体?
您只需从 EM 中检索一个用户对象, 更新已更改(或全部)的字段 提交事务(如果您手动管理事务)
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 检索到的用户对象将拥有关于它们的完整信息,只要您不修改其 items 内容,这些项目将保持不变。