2016-02-19 3 views
0

У меня есть следующая структура (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); 
} 

После завершения транзакции, я запрашиваю автомобиль, но автомобиль не прилагается драйвер. Любая идея, почему это происходит и как это можно исправить?

+0

Является ли ваша функция помеченной как @Transactional? можете ли вы показать весь код, в котором вы сохраняете объект? – Irakli

+1

и вы видите ОБНОВЛЕНИЕ к объекту Car в базе данных (и в журнале)? И где «слияние» упоминается в названии? –

+0

В первом сообщении я сказал, что код выполняется внутри транзакции :) Я вижу запрос UPDATE в журналах. Объединившись, я хотел сказать: обновить связь между родительским и дочерним сущностями. Извините, если заголовок вводит в заблуждение. – CipQuestion

ответ

0

Если вы полагаетесь на существующие в базе данных вашей организации после вызова сохраняется(), но до того, как транзакции, а затем вызвать Flush() в первую очередь.

см это подробно:

http://blakecaldwell.net/blog/2013/9/3/dont-rely-on-entitymanagerpersist-for-immediate-insert.html

+0

Не работает. Если я снова ищу Автомобиль, в той же транзакции, после того, как водитель был сохранен, найденный автомобиль содержит водителя. Я не знаю, может ли эта информация помочь. Спасибо. – CipQuestion

0

А если попробовать

public void addDriver(long carId, Driver driver) {
Car car = entityManager.find(Car.class, carId); car.setDriver(driver); entityManager.merge(car) }

Поскольку вы каскадный автомобиль должен быть вставлен и связаны между собой.