这是我的两个实体的样本:
@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 :(得分: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
侦听器。