JPA - 更新孩子对父母的引用

Posted

技术标签:

【中文标题】JPA - 更新孩子对父母的引用【英文标题】:JPA - Update childs refrence to parent 【发布时间】:2016-12-15 17:19:44 【问题描述】:

如果我有这样的父母

public class Company implements Serializable 
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="COMPANY_ID", updatable = false)
private int companyId;

//bi-directional many-to-one association to User
@OneToMany(mappedBy="company")
private List<User> users;

还有这样的孩子

public class User implements Serializable 
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="USER_ID", updatable=false)
private int userId;

private String username;

//bi-directional many-to-one association to Company
@ManyToOne
@JoinColumn(name="COMPANY_ID")
private Company company;

然后在我的 JAX-RS REST 调用中,我从 A 公司的数据库中检索一个用户,我想将该用户更改为 B 公司。这就是我所拥有的

@POST
@Path("updateUserCompany")
@Produces("application/json")
public Response updateUserCompany() 

    //this get the company I want to set the user to
    Company company = entityManager.createNamedQuery("Company.getCompanyByName", Company.class)
                .setParameter("companyName", "CompanyB")
                .getSingleResult();

    //this gets the user i want to change
     User user = entityManager.createNamedQuery("User.getUserById", User.class).setParameter("userId", 1).getSingleResult();

     user.setCompany(company);
     entityManager.persist(user);
     entityManager.flush();

但是用户没有在数据库中更新?我怎样才能让它在数据库中更新?

谢谢

【问题讨论】:

1) 您的 JAX-RS REST 类是 EJB 吗?因为如果不是这段代码在事务内部执行。使用javax.transaction.Transactional 注释您的updateUserCompany() 方法。 2) 使用entityManager.merge() 方法代替persist whish 用于持久化新实体(插入行) 【参考方案1】:

我相信您指的是在用户实体上调用持久化时,公司表中没有从 A 更新到 B 的公司。

您是否尝试过级联属性?它适用于需要保存/更新映射实体(子)的场景,当保存/更新父实体时(反之亦然,当 inverse=true 时)。

我还注意到 userId 上的 (updatable=false),但 setParameter() 在 updateUserCompany 方法中被调用。我认为这已经得到了解决。

【讨论】:

以上是关于JPA - 更新孩子对父母的引用的主要内容,如果未能解决你的问题,请参考以下文章

跳过孩子到父母的获取 - JPA

深入了解保留周期

React,如何从父母那里访问孩子的状态?无需更新父母的状态

如何从孩子的父母访问模板引用变量?

反应孩子与父母的沟通问题

NSManagedObjectContext - 当父母改变时如何更新孩子?