2016-09-29 7 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; 

} 

ve는 Spring Boot JPA 저장소와 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이 만들어지고 데이터베이스에 해당 Person이 유지되지만 반환 된 Person 인스턴스에는 ID 집합이 없습니다. 즉, addPerson(). getId()는 null을 반환합니다. 지속 된 버전의 ID를 가진 사람 인스턴스를 반환하도록 서비스를받을 수 있습니까?

서비스의 addPerson() 메소드를 사용하여 생성 된 Person을 변경하고 이후 변경 사항을 유지할 수 있습니다.

+0

아마도 너는 bidirectonnnal 관계 집을 가져야 만한다. 그러나 사람은 집에 갈 수 없다. – Tokazio

+0

죄송합니다. 코드에서 제외했습니다. 양방향 관계가 있습니다. 이것을 보여주기 위해 질문을 업데이트했습니다. 감사. – bobsyouruncle

+0

도 캐스케이드가 포함되어 있습니까? – Tokazio

답변

1

Person의 ID를 얻으려면 PersonRepository를 만들 수 있습니다. 이 questshion에 있습니다.

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

이전에 사람 ID를 얻으려면 id를 생성하고 수동으로 설정해야합니다.

0

모든 ORM 프레임 워크에서 db의 엔티티 지속성은 ORM이 적용된다는 것을 의미합니다. houseRepository.save(house)을 호출 한 엔티티가 데이터베이스에 즉시 유지된다는 보장이 없음을 의미합니다. JPA를 사용하여 트랜잭션 범위 내에서 즉시 엔티티를 플러시 할 수 있습니다. 이를 위해

당신이 거기에 아래의 코드

entityManager.flush(); 

나는 봄 부팅 JPA가에 플러시 작업을 용이하게 생각을 부가 entityManager.persist()

시도를 호출 한 후 아래의 로직을 추가 할 houseRepository.save 방법을 수정 한 것입니다 , 그 경우에 당신은 지속 호출 후에 houseRepository.flush()으로 직접 전화 할 수 있습니다.

+0

은 지속되는 대신 저장되지만 차이점을 알지 못합니다. 감사. – Tokazio