2016-09-29 26 views
1

У меня возникают проблемы с обновлением объекта, созданного как часть набора в отношениях @OneToMany.Обновление элемента, созданного как часть отношений @OneToMany

Предположим, что у меня есть очень простой модели предметной области, состоящий из домов и людей, которые живут в этих домах:

Дом:

@Entity 
public class House { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true) 
    private Set<Person> persons; 

    public void addPerson(Person p) { 
     persons.add(p);   

    public Set<Person> getPersons() { 
     return persons; 
    } 

} 

лицо:

@Entity 
public class Person { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne 
    private House house; 

} 

Я у нас есть хранилище JPA Spring Boot для дома и HouseService по методу:

@Transactional 
public Person addPerson(Long houseId) { 
    House house = houseRepository.findOne(houseId); 
    Person person = new Person(); 
    house.addPerson(person); 
    houseRepository.save(house); 
    return person; 
} 

Вызов вышеуказанного метода создает новое Лицо и сохраняется это лицо в базе данных, но экземпляр возвращаемого Person не имеет набора идентификаторов (т. Е. AddPerson(). GetId() возвращает null). Могу ли я заставить службу вернуть экземпляр человека, у которого есть идентификатор сохраненной версии?

Я хочу внести изменения в Личность, созданные с использованием метода addPerson() службы, и иметь возможность сохранять эти изменения на более позднем этапе.

+0

Возможно, у вас должно быть двунаправленное отношение дом может иметь человека, но человек havn't house – Tokazio

+0

Извините, что я оставил это из кода - есть двунаправленные отношения, я обновил вопрос, чтобы показать это. Благодарю. – bobsyouruncle

+0

с каскадом тоже? – Tokazio

ответ

1

Если вы хотите получить идентификатор Person, вы можете создать PersonRepository. Как в этом questshion.

person = personRepository.save(person); 
personRepository.flush(); 
id=person.getId(); 

Если вы хотите получить идентификатор лица до его сохранения, вы должны сгенерировать идентификатор и вручную установить его.

0

В любой структуре ORM постоянство объекта в db определяется ORM, так как нет гарантии, что сущность, которую вы вызвали для houseRepository.save(house), будет немедленно сохранена в базе данных, в случае, если вы хотите такого поведения, вам нужно заставить вашей JPA, чтобы немедленно удалить объект в пределах транзакции.

Для этого у вас будет модифицировать свой метод houseRepository.save добавить ниже логику после того, как он называет entityManager.persist()

Попробуйте добавить следующий код там

entityManager.flush(); 

Я считаю, Спринг загрузочный JPA облегчает промывочной операции в ней , в этом случае вы можете позвонить по телефону houseRepository.flush() после вашего вызова.

+0

видел сохранение вместо сохранения, но не знает различий. Благодарю. – Tokazio