我有一个包含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 (?, ?)
图书馆版本:
答案 0 :(得分:3)
这是使用单向包的预期行为。根据[Hibernate Anti-Patterns] [1]:
行囊语义在性能方面表现最差 操作次数,因为它总是重新创建整个集合。 Hibernate发出一个删除语句来删除所有的关联 关联表中的旧集合。然后,它发出N个插入 将表示新集合的所有关联添加到 关联表。 Hibernate不分析有多少元素 该系列已被更改。