Hibernate是保留父子数据的有效方法

时间:2017-12-09 10:12:51

标签: java hibernate

我有以下实体,在做出最终决定之前,我想提出一些额外的想法。

发布

@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对象可能包含大量注释,这反过来会增加网络上的额外负载。

1 个答案:

答案 0 :(得分:0)

首先要完成这项工作,你需要在后期实体中进行级联,否则它只会更新/保存后期实体

@OneToMany(cascade = CascadeType.ALL ,mappedBy = "post")
private List<Comment> comments;

此外,hibernate通过脏检查您的实体来工作。

合并(更新)期间的Hibernate会脏检查您的托管实体并为您更改的实体生成一个更新查询,因此如果您不触摸Post实体并只更新一个{{1 hibernate将生成一个更新查询。

这句话也毫无意义。

  

另外,我不喜欢帖子对象的想法,这需要   在数据库中更新,可能包含大量注释,其中   反过来又增加了网络上的额外负担。

Comment中指定的OneToMany关系仅用于休眠方便,实际上是可选的。 通过它,您可以定义所谓的双向关系。

除了Post引用Comment

上的fk之外,db中没有任何内容