2017-11-30 13 views
1

나는이 엔티티를 가지고있다.이 프로퍼티는 "parent"속성을 가진 메시지 또한 Message 유형이다. 자식이 parent = null 인 메시지를 만들고 parent = message 인 메시지는 주석이 될 것이므로 트리 메시지와 주석이 있습니다.Hibernate @ManyToOne 자체 호출

@Entity 
@Table(name = "message") 
public class Message extends BaseModel{ 

    @Id 
    @Column(name = "id", updatable = false, nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name="user_id", nullable=false) 
    private User user; 

    private String text; 

    @ManyToOne(fetch = FetchType.EAGER, optional = true) 
    @JoinColumn(name = "message_id",nullable = true) 
    private Message parent; 

그러나 나는 여기에 코드 내 개체를 저장하려고하면

org.hibernate.TransientPropertyValueException : null이 아니 특성 참조 난 항상이 메시지

Message message = messageRepository.save(
       MapperUtils.getInstance().map(messageDTO,Message.class) 
     ); 

을 일시적인 값 - 일시적인 인스턴스는 현재 작업 전에 저장해야합니다. gara.models.Message.user -> gara.models.User;
org.hibernate.TransientPropertyValueException : null이 아니 특성
참조 과도 값 - 과도 인스턴스가 현재 작업하기 전에 저장해야합니다 : 상자의 예외는 java.lang.IllegalStateException입니다 gara.models.Message.user -> 가라. models.User는 "

나는 그것을 고정 수있는 방법 또는 작업가 약?

감사합니다! 오류가 해결책을 알려줍니다

답변

1

가. 당신은 unma와 사용자 종속성을 설정하는 네이제/분리 개체.

당신이 (되찾기 방법을 사용하여 예를 들어) 영속 컨텍스트에 이미있는 사용자와 메시지를 채울 수 있는지 확인하십시오

userRepository.getOne(id); // just get the reference 

하거나, 사용자가 DB에 아직없는 경우 .. userRepository.save 또는 관계에 cascade 옵션 설정 :

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
@JoinColumn(name="user_id", nullable=false) 
private User user; 

동일한 경우는 parent 셀프 의존성 될 수있다.

+0

당신이 맞습니다 : MapperUtils.getInstance(). map (messageDTO, Message.class)는 user-> id 속성없이 객체를 파싱합니다 ... 오류가 있습니다. –