2016-10-12 6 views
1

2 명의 대상자와 주소가 있습니다. 사람은 부모이고 주소는 자식입니다.JPA 업데이트 부모 자식

  • 담당자 : personPK, 상태
  • 주소 : addressPK, person_fk, 상태

내 저장소 JPARepository을 확장한다. personRepository.save(person); 은 삽입시 잘 작동합니다. 그러나 두 테이블에서 상태 (예 : 활성)를 업데이트하여 person 객체를 업데이트 할 때 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 private 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

이것을 배포하려면 @JoinColumn 주석에서 referencedColumnName을 제거해야했지만 한 번 수행하면 훌륭했습니다. MappingException : org.hibernate.mapping.Table (person)의 논리 이름이 person_pk 인 컬럼을 찾을 수없고, 관련된 상위 테이블과 2 차 테이블 – ScottM

관련 문제