2016-06-06 6 views
0

Wenn ich das folgende Entity-Objekt habe, das mehrere Fremdschlüsselbeziehungen hat, wie handle ich mit der Formularübergabe, wenn ich das Beziehungsobjekt nicht in der Anfrage zurückbekomme.JPA-Persist-Beziehungen

Das Unternehmen könnte wie folgt aussehen:

@Entity 
@Table(name = "employee") 
public class Employee implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id") 
private Long id; 

@Column(name = "first_name") 
private String firstName; 

@Column(name = "last_name") 
private String lastName; 

@Column(name = "middle_name") 
private String middleName; 

@Column(name = "login_id") 
private String loginId; 

@ManyToOne(fetch = FetchType.EAGER, optional = false) 
@JoinColumn(name = "department_id") 
private Department department; 

@ManyToOne(fetch = FetchType.EAGER, optional = false) 
@JoinColumn(name = "employment_type_id") 
private EmploymentType employmentType; 

@ManyToOne(fetch = FetchType.EAGER, optional = false) 
@JoinColumn(name = "citizenship_id") 
private Citizenship citizenship; 

public Employee() { 
} 
} 

Aber das ist die HTTP-POST-Anfrage ich empfangen werde.

id: 1 
firstName: Bob 
lastName: Dole 
middleName: Trump 
loginId: bdole 
departmentId: 1 
employmentTypeId: 2 
citizenship_id: 4 

JPA möchte das Beziehungsobjekt und nicht die ID speichern. Allerdings scheint es auch ineffizient zu sein, all diese Lookups zu machen, die die IDs zu den erforderlichen Objekten machen. Gibt es einen besseren Weg, damit umzugehen?

+0

Haben Sie daran gedacht, den Fremdschlüssel als Basiszuordnung zuzuordnen, anstatt ihn als Referenzzuordnung zu verwenden? Wenn Ihre Anwendung nicht die gesamte Abteilung, den Beschäftigungstyp und die Staatsbürgerschaft abrufen und weitergeben muss, warum sollten Sie Ihre Anwendung damit im Objektmodell belasten? Die Chancen stehen gut, dass Sie Nachschlagevorgänge durchführen müssen, um sicherzustellen, dass diese IDs vorhanden sind. Andernfalls kann Ihr Post Ihnen nicht vorhandene Abteilungsnummern geben, so dass Sie das Nachschlagen trotzdem vornehmen müssen. – Chris

Antwort

1

Verwenden getReference http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#getReference%28java.lang.Class,%20java.lang.Object%29

Es ruft die EntityManager Kundenobjekt laden die ID verwenden und dann die Geschichte auf den Kunden einstellen. In den meisten Fällen würde dieser Aufruf einen Proxy mit nur der eingebetteten ID zurückgeben.

Department department = entityManager.getReference(Department.class, departmentId); 

Employee employee = new Employee(); 
employee.setDepartment(department);