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! 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);
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.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