在.persist()之后没有填充JPA实体关系

时间:2011-03-13 00:07:03

标签: jpa

这是我的两个实体的样本:

@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();

我认为在坚持“发布”后,它会变得“受管理”,所有的关系都应该从现在开始填充。

感谢您的帮助!

(注意:公共属性仅用于演示)

2 个答案:

答案 0 :(得分:1)

没有。从数据库加载实体时,Hibernate将填充关系。但是当你坚持或改变它们时,你有责任维护双方的关系。

由于Hibernate实体也是您将在其他层和单元测试中使用的POJO,因此您应该确保不变量是正常的。例如,修订列表永远不应为null。它最初应该是空的。

答案 1 :(得分: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侦听器。