У меня есть следующая структура (OneToOne однонаправленная)JPA слияние родитель с новым ребенком
@Entity
public class Car {
@Id
@Column(name = ID)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinColumn(name = "DRIVER_ID")
private Driver driver;
// setters and getters and other properties
}
@Entity
public class Driver {
@Id
@Column(name = ID)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// setters and getters and other properties
}
Проблема заключается в том, что если у меня уже есть существующий автомобиль, но нет драйвера и добавить драйвер в запрашиваемом автомобиль из базы данных, драйвер будет вставлен (я вижу, что генерируется запрос вставки).
Следующая логика происходит внутри транзакции:
// this is a raw version of the code that gets executed, skipped validation and stuff like that
public void addDriver(long carId, Driver driver) {
entityManager.persist(driver);
Car car = entityManager.find(Car.class, carId);
car.setDriver(driver);
}
После завершения транзакции, я запрашиваю автомобиль, но автомобиль не прилагается драйвер. Любая идея, почему это происходит и как это можно исправить?
Является ли ваша функция помеченной как @Transactional? можете ли вы показать весь код, в котором вы сохраняете объект? – Irakli
и вы видите ОБНОВЛЕНИЕ к объекту Car в базе данных (и в журнале)? И где «слияние» упоминается в названии? –
В первом сообщении я сказал, что код выполняется внутри транзакции :) Я вижу запрос UPDATE в журналах. Объединившись, я хотел сказать: обновить связь между родительским и дочерним сущностями. Извините, если заголовок вводит в заблуждение. – CipQuestion