2011-03-13 6 views
1

이 내 두 엔티티의 샘플입니다JPA 엔티티 관계가 .persist 후 채워지지 않습니다()

@Entity 
public class Post implements Serializable { 
    @OneToMany(mappedBy = "post", fetch = javax.persistence.FetchType.EAGER) 
    @OrderBy("revision DESC") 
    public List<PostRevision> revisions; 

@Entity(name="post_revision") 
public class PostRevision implements Serializable { 
    @ManyToOne 
    public Post post; 

    private Integer revision; 

    @PrePersist 
    private void prePersist() { 
     List<PostRevision> list = post.revisions; 

     if(list.size() >= 1) 
      revision = list.get(list.size() - 1).revision + 1; 
     else 
      revision = 1; 
    } 

는 그래서는 "포스트"가 그리고 그것은 몇 가지 수정을 할 수 있습니다. 리비전을 지속하는 동안 엔티티는 기존 리비전 목록을보고 다음 리비전 번호를 찾습니다. 문제는 Post.revisions이 NULL이지만 자동으로 채워 져야한다고 생각합니다. 내 소스 코드에는 어떤 종류의 문제가있는 것 같지만 어디에 있는지 모른다. 여기 내 "지속성"코드입니다 :

Post post = new Post(); 
PostRevision revision = new PostRevision(); 
revision.post = post; 

em.persist(post); 
em.persist(revision); 
em.flush(); 

내가 "게시물"지속 한 후, 그것은 "관리"가되어 모든 관계가 지금부터 채워해야한다고 생각합니다.

도움 주셔서 감사합니다.

: 데이터베이스에서 엔티티를로드 할 때

답변

0

번호 Hibernate가 관계를 채 웁니다 (주 공공 속성은 시연을 위해 단지이다). 그러나 당신이 그것을 유지하거나 변경할 때, 양측 모두에서 관계를 유지하는 것은 당신의 책임입니다.

Hibernate 엔티티는 다른 레이어와 단위 테스트에서 사용할 POJO이기 때문에 불변식이 OK인지 확인해야합니다. 예를 들어, 리비전 목록은 결코 null이 될 수 없습니다. 처음에는 비어 있어야합니다.

+0

답변 해 주셔서 감사합니다. 그러나 필자의 경우 EclipseLink에서 데이터베이스에서 엔티티를로드하려면 어떻게해야합니까? EntityManager.find()를 사용합니까? 나도 그걸 시도했지만 어느 것도 작동하지 않는다. (리비전은 여전히 ​​null이다.) – Tomik

1

는에 Post 엔티티를 변환 :

@Entity 
public class Post implements Serializable { 
    @OneToMany(mappedBy = "post", fetch = javax.persistence.FetchType.EAGER) 
    @OrderBy("revision DESC") 
    public List<PostRevision> revisions = new ArrayList<PostRevision>(); 

    public void addRevision(PostRevision revision) { 
     if (post.revisions.isEmpty()) { 
      revision.setRevision(1); 
     } else { 
      revision.setRevision(post.revisions.get(post.revisions.size() - 1)); 
     } 
     revision.setPost(this); 
     getRevisions().add(revision); 
    } 
} 

그리고 당신이 게시물에 수정을 추가 할 때 addRevision를 사용하십시오. 이 솔루션을 사용하면 청취자 인 @PrePersist도 제거해야합니다.

관련 문제