我有以下实体,在做出最终决定之前,我想提出一些额外的想法。
发布
@Entity
public class Post {
@Id
@GeneratedValue
private long id;
private String author;
private String content;
private String title;
@OneToMany
private List<Comment> comments;
// Standard getters and setters...
}
持有子行的实体
@Entity
public class Comment {
@Id
@GeneratedValue
private long id;
private String author;
private String content;
@ManyToOne
private Post post;
// Standard getters and setters...
}
帖子可能包含大量评论,其中大多数评论当然不会在用户会话期间发生变化。我想找出在以下场景中保存数据的最佳方法: 1.发布数据不变; 2.发布数据已更改。
标准方法是使用以下代码
Post saved = postRepository.save(post);
但是,如果您只添加了一条评论或更改了帖子,这种方法最有效吗?这里的方法是否应该不同,即删除Post和Comment实体之间的一对多关系并单独处理它们?另外,我不喜欢这样的想法,即需要在数据库中更新的post对象可能包含大量注释,这反过来会增加网络上的额外负载。
答案 0 :(得分:0)
首先要完成这项工作,你需要在后期实体中进行级联,否则它只会更新/保存后期实体
@OneToMany(cascade = CascadeType.ALL ,mappedBy = "post")
private List<Comment> comments;
此外,hibernate通过脏检查您的实体来工作。
合并(更新)期间的Hibernate会脏检查您的托管实体并为您更改的实体生成一个更新查询,因此如果您不触摸Post
实体并只更新一个{{1 hibernate将生成一个更新查询。
这句话也毫无意义。
另外,我不喜欢帖子对象的想法,这需要 在数据库中更新,可能包含大量注释,其中 反过来又增加了网络上的额外负担。
Comment
中指定的OneToMany
关系仅用于休眠方便,实际上是可选的。
通过它,您可以定义所谓的双向关系。
除了Post
引用Comment