添加到List时,Hibernate会重新创建连接表

时间:2014-07-04 20:40:11

标签: java hibernate jpa orm spring-data

我有一个包含Comment列表的Story,用JoinTable映射。 我注意到每次向列表添加新的Comment时,hibernate都会删除并重新创建与故事相关的连接表中的所有条目。 我希望它只是在表格中添加一个新行。 在下面的代码中,保存方法由Spring Data实现。 我错过了什么吗? 谢谢。

Story.java:

@Entity
public class Story implements Serializable {
    @OneToMany
    @JoinTable(name="UserComment", joinColumns = @JoinColumn(name = "Story_id"), inverseJoinColumns = @JoinColumn(name = "Comment_id"))
    private List<Comment> userComments;
    ...

Comment.java:

@Entity
public class Comment implements Serializable {
...

添加新评论

Comment comment = new Comment();
comment.setContent(content);
commentRepository.save(comment);
story.getUserComments().add(comment);
storyRepository.save(story);

Hibernate登录storyRepository.save(故事)执行:

Hibernate: delete from UserComment where Story_id=?
Hibernate: insert into UserComment (Story_id, Comment_id) values (?, ?)
Hibernate: insert into UserComment (Story_id, Comment_id) values (?, ?)
Hibernate: insert into UserComment (Story_id, Comment_id) values (?, ?)
Hibernate: insert into UserComment (Story_id, Comment_id) values (?, ?)
Hibernate: insert into UserComment (Story_id, Comment_id) values (?, ?)
Hibernate: insert into UserComment (Story_id, Comment_id) values (?, ?)
Hibernate: insert into UserComment (Story_id, Comment_id) values (?, ?)

图书馆版本:

  • Hibernate 4.3.5
  • Spring Data JPA 1.6.0

1 个答案:

答案 0 :(得分:3)

这是使用单向包的预期行为。根据[Hibernate Anti-Patterns] [1]:

  

行囊语义在性能方面表现最差   操作次数,因为它总是重新创建整个集合。   Hibernate发出一个删除语句来删除所有的关联   关联表中的旧集合。然后,它发出N个插入   将表示新集合的所有关联添加到   关联表。 Hibernate不分析有多少元素   该系列已被更改。

  1. 您可以通过将其转换为id-bag来优化它,这是一个索引列表。
  2. 你可以将具有2个@ManyToOne关联的UserComment映射映射到Story和Comment,这样你的包就会变成一个mappedBy双向包,它比单向包更有效(因为mappedBy包不会控制)关联,因为它将是@ManyToOne方面将状态转换传播到SQL语句。)