我有一个Message
实体和一个Recipient
实体,前者与后者具有单向ManyToMany
关系,因此(删除了样板代码):
@Entity
public class Message {
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable(name = "message_recipient", joinColumns = @JoinColumn(name = "message_id"), inverseJoinColumns = @JoinColumn(name = "recipient_id"))
private Set<Recipient> recipients;
}
现在我想将一条消息保存到数据库中,但我希望将消息与许多收件人关联,有时可能会有数千个。因此,我想避免在内存中保留一组数千个对象,而是分批保持关联,这样一次只有X个收件人在内存中。我的想法是,我可以做类似下面的伪代码。
Message message = new Message();
Set<Recipient> recipients = first 500 recipients
while (recipients != null) {
message.setRecipients(recipients);
messageRepository.saveAndFlush(message);
if (there are more recipients to save) {
recipients = next 500 recipients
} else {
recipients = null;
}
}
我的假设/希望是Hibernate会检测到除了message
关联之外没有对recipients
实体的属性进行任何更改,并且由于级联类型设置为{{ 1}},除了已经持久化的收件人之外,还将添加新收件人。但是,实际发生的情况是收件人在每次迭代时都是持久的,但是在持久化新关联之前,它们会在下一次迭代时被删除。结果是只有循环的最后一次迭代中的关联被持久化到数据库中(因为插入后其余部分被删除)。
这种方法可能以一种不应该被使用的方式“黑客攻击”Hibernate。我怎样才能批量持续关联,这样我一次只能将X对象保存在内存中?
我正在使用带有Spring MVC和Spring Data JPA的Hibernate 4.3.8。