JPA-utrzymywanie relacji jeden do wielu

Może to głupie pytanie, ale mnie to wkurza.

Mam dwukierunkowy stosunek pracownika do pojazdu. Kiedy utrzymuję pracownika w bazie danych po raz pierwszy (tzn. nie ma przypisanego identyfikatora), chcę również, aby jego powiązane pojazdy były utrzymywane.

To działa dobrze dla mnie w tej chwili, z wyjątkiem tego, że mój zapisany podmiot pojazdu nie jest automatycznie mapowany powiązany pracownik, a w bazie danych kolumna klucza obcego employee_id w tabela pojazdu jest zerowa.

Moje pytanie brzmi, czy możliwe jest, aby pracownik pojazdu wytrwał w tym samym czasie, gdy sam pracownik jest wytrwały? Zdaję sobie sprawę, że najpierw trzeba uratować pracownika, a potem samochód. Czy JPA może to zrobić automatycznie dla mnie? A może muszę zrobić coś takiego:

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);
Dzięki!

Edit: zgodnie z życzeniem, oto moje mapowania (bez wszystkich innych metod itp.)

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

    ...
}

Właśnie zdałem sobie sprawę, że powinien mieć następującą metodę zdefiniowaną na mojej klasie pracownika:

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

Teraz powyższy kod będzie wyglądał tak:

Vehicle vehicle1 = new Vehicle();

Employee newEmployee = new Employee("matt");
newEmployee.addVehicle(vehicle1);
Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
Znacznie prostsze i czystsze. Dziękujemy wszystkim za pomoc!
Author: Manuel Drieschmanns, 2009-11-25

2 answers

Musisz ustawić powiązanego pracownika na pojeździe przed utrzymaniem pracownika.

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

newEmployee.setVehicles(vehicles);

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
 32
Author: Bobby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-11 09:19:15

Jednym ze sposobów na to jest ustawienie opcji kaskady na "jednej" stronie relacji:

class Employee {
   // 

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

   //
}

By this, when you call

Employee savedEmployee = employeeDao.persistOrMerge(newEmployee);
To też uratuje Pojazdy.
 16
Author: user218435,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-12 05:07:44