2016-12-15 131 views
0

如果我有這樣的JPA - 更新童車refrence於母公司

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(); 

但是用戶沒有更新D B?我如何在數據庫中更新它?

感謝

+0

1)您的JAX-RS REST類EJB是什麼?因爲如果這個代碼不是在內部交易中執行的話。用'javax.transaction.Transactional'註釋'updateUserCompany()'方法。 2)使用'entityManager.merge()'方法,而不是使用persist來持久化新實體(插入行) – Artem

回答

0

我相信你指的是公司不被從A更新公司表中所示,當一直存在被用戶調用的實體。

您是否嘗試過級聯屬性?這意味着對於需要保存/更新映射實體(子)的情況,當父實體保存/更新時(當inverse = true時反之亦然)。

我也注意到了userId上的(updatable = false),但在updateUserCompany方法中調用了setParameter()。我認爲這已經被照顧了。