2016-12-15 3 views
0

Wenn ich einen Elternteil wie diesJPA - Update Childs refrence Mutter

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; 
} 

Und ein Kind wie diese

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; 
} 

Und dann in meinem JAX-RS REST habe rufe abrufen ich einen Benutzer aus der DB, die in Unternehmen A ist, und ich möchte hier, dass der Nutzer Firma B ändern ist, was ich

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

Aber der Benutzer nicht aktualisiert wird in der haben DB? Wie kann ich es in der DB aktualisieren lassen?

Dank

+0

1) Ist Ihre JAX-RS REST Klasse EJB? Denn wenn dieser Code nicht innerhalb der Transaktion ausgeführt wird. Notieren Sie Ihre 'updateUserCompany()' Methode mit 'javax.transaction.Transactional'. 2) Verwende 'entityManager.merge()' Methode anstelle von 'persist', die für persistierende neue Entitäten verwendet wird (Zeilen einfügen) – Artem

Antwort

0

Ich glaube, Sie an die Firma beziehen sich nicht von A aktualisiert wird in der Firma Tabelle nach B fortbesteht, solange auf der Benutzereinheit aufgerufen wird.

Haben Sie die Kaskadeneigenschaft ausprobiert? Es ist für Szenarien gedacht, in denen die abgebildeten Entitäten (untergeordnet) gespeichert/aktualisiert werden müssen, wenn die übergeordnete Entität gespeichert/aktualisiert wird (das Gegenteil ist der Fall, wenn invers = wahr ist).

Ich bemerke auch (update = false) auf der userId, aber setParameter() wird in updateUserCompany-Methode aufgerufen. Ich denke, das ist schon erledigt.