2009-11-25 8 views
43

Vielleicht ist das eine blöde Frage, aber sie nervt mich.JPA - Eine One to Many-Beziehung beibehalten

Ich habe eine bidirektionale Eins-zu-viele-Beziehung von Mitarbeiter zu Fahrzeugen. Wenn ich einen Mitarbeiter zum ersten Mal in der Datenbank persistiere (d. H. Er hat keine zugewiesene ID), möchte ich auch, dass die zugehörigen Fahrzeuge beibehalten werden.

Dies funktioniert im Moment gut für mich, außer dass meine gespeicherte Vehicle-Entität den verknüpften Employee nicht automatisch zuordnen kann und in der Datenbank die Spalte für die Fremdschlüssel der employee_id in der Vehikel-Tabelle null ist.

Meine Frage ist, ist es möglich, den Mitarbeiter des Fahrzeugs zur gleichen Zeit persistent zu halten, die der Angestellte selbst persistiert wird? Mir ist klar, dass der Mitarbeiter zuerst gespeichert werden muss und dann das Fahrzeug gespeichert werden muss. Kann JPA dies automatisch für mich tun? Oder muss ich etwas wie das Folgende tun:

Vehicle vehicle1 = new Vehicle(); 
Set<Vehicle> vehicles = new HashSet<Vehicle>(); 
vehicles.add(vehicle1); 

Employee newEmployee = new Employee("matt"); 
newEmployee.setVehicles(vehicles); 
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

vehicle1.setAssociatedEmployee(savedEmployee); 
vehicleDao.persistOrMerge(vehicle1); 

Vielen Dank!

Edit: Wie gewünscht, hier ist meine Abbildungen (ohne alle anderen Methoden usw.)

@Entity 
public class Employee { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="employee_id") 
    private Long id; 

    @OneToMany(mappedBy="associatedEmployee", cascade=CascadeType.ALL) 
    private Set<Vehicle> vehicles; 

    ... 

} 

@Entity 
public class Vehicle { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="vehicle_id") 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name="employee_id") 
    private Employee associatedEmployee; 

    ... 
} 

ich die folgende Methode definiert in meiner Klasse Employee hatte gerade realisiert Ich hätte:

public void addVehicle(Vehicle vehicle) { 
    vehicle.setAssociatedEmployee(this); 
    vehicles.add(vehicle); 
} 

nun über den Code wird wie folgt aussehen:

Vehicle vehicle1 = new Vehicle(); 

Employee newEmployee = new Employee("matt"); 
newEmployee.addVehicle(vehicle1); 
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

Viele einfacher und sauberer. Danke für Ihre Hilfe!

Antwort

30

Sie müssen den zugeordneten Mitarbeiter auf dem Fahrzeug festlegen, bevor Sie den Mitarbeiter persistieren.

Employee newEmployee = new Employee("matt"); 
vehicle1.setAssociatedEmployee(newEmployee); 
vehicles.add(vehicle1); 

newEmployee.setVehicles(vehicles); 

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 
+2

Ooh, ok. Das funktioniert. Aber ich dachte, es könnte einen Weg geben, auf dem ich den zugehörigen Mitarbeiter nicht explizit auf das Fahrzeug setzen muss? – JMM

+0

Ich glaube nicht, dass das mit JPA möglich ist. Ich habe auch Hibernate benutzt und da, wenn ich mich richtig erinnere, ist das möglich. – Bobby

+0

Danke, dass du das Problem in meinem ursprünglichen Code aufgezeigt hast, ich habe es aktualisiert, wie ich es lösen werde. – JMM

15

Eine Möglichkeit, das zu tun, ist auf Sie die CASCADE-Option, um „One“ Seite der Beziehung:

class Employee { 
    // 

    @OneToMany(cascade = {CascadeType.PERSIST}) 
    private Set<Vehicles> vehicles = new HashSet<Vehicles>(); 

    // 
} 

durch diese, wenn Sie

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee); 

nennen es die Fahrzeuge sparen zu .

+0

Hallo, danke für die Antwort. Ich habe die Kaskade, wo Sie vorgeschlagen haben und die Fahrzeuge werden gespeichert. Mein Problem ist, dass wenn die Fahrzeuge gespeichert werden, ich will, dass ihre Fremdschlüsselspalte employee_id die ID des Angestellten enthält, den ich gerade gespeichert habe. – JMM

+1

Der Fremdschlüssel soll in der Kaskade gespeichert werden ... Könnten Sie die @OneToMany- und @ManyToOne-Anmerkungen senden, die Sie für die Überprüfung verwenden? Mit freundlichen Grüßen Denes – user218435

+0

Ich habe meinen ursprünglichen Beitrag aktualisiert, um die Anmerkungen aufzunehmen. – JMM