2016-10-12 2 views
1

У меня есть 2 человека и адрес объекта. человек является родителем, а адрес - дочерним.JPA обновление родительский ребенок

  • лицо: personPK, статус
  • Адрес: addressPK, person_fk, статус

Мой репозиторий расширяет JPARepository. personRepository.save(person); работает нормально для вставки. Но когда я обновляю объект person, обновляя статус (например: Active) в обеих таблицах и использую personRepository.save(person); Мои ссылки на внешние ключи (person_fk) установлены как null.

Мой родительский класс:

@Entity 
@DynamicUpdate 
@Table(name = "person") 
public class Person { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="person_pk", nullable=false) 
    private Long personPK; 
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "person",cascade = CascadeType.PERSIST) 
    private Set<Address> addresses = new HashSet<>(); 
    ... 
} 

И мой ребенок класс:

@Entity 
@DynamicUpdate 
@Table(name = "address") 
public class Address { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "address_pk") 
    private Long addressPK; 
    @ManyToOne 
    @JoinColumn(name = "person_fk", referencedColumnName = "person_pk", nullable=false) 
    private Address address; 
    ... 
} 

И от моего уровня сервиса Я обновляю его с помощью: personRepostiry.save(person);

Любая помощь, что я делаю Неправильно здесь?

+0

Можете ли вы показать код, где происходит сбой (ваша логика обновление) –

+2

@shadab Я предполагаю, что в вашей сущности 'Address' вам нужен член:' private Person person; 'вместо' private Address address; '? – sanastasiadis

+0

@sanastasiadis Я считаю, что он не разделил полный код, как будто это полный код, который он не смог бы добавить слишком правильно? –

ответ

4

Во-первых Изменение:

@ManyToOne 
@JoinColumn(name = "person_fk", referencedColumnName = "person_pk", nullable=false) 
private Address address; 

к:

@ManyToOne(targetEntity = Person.class) 
@JoinColumn(name = "person_fk", referencedColumnName = "person_pk", nullable = false) 
private Person person; 

затем изменить:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "person",cascade = CascadeType.PERSIST) 
private Set<Address> addresses = new HashSet<>(); 

к:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "person", cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
private Set<Address> addresses = new HashSet<>(); 

и добавить в класс Person:

public void addAddress(Address address) { 
    address.setPerson(this); 
    addresses.add(address); 
} 

затем использовать:

person.addAddress(address); 
persist(person) 

или

merge(person); 
+0

Мне пришлось удалить ссылочное имяColumnName из аннотации @JoinColumn, чтобы развернуть его, но как только я это сделал, он отлично поработал. С его помощью я получил это исключение: MappingException: не удалось найти столбец с логическим именем: person_pk в org.hibernate.mapping.Table (личность) и связанные с ним суператы и вторичные таблицы – ScottM

Смежные вопросы