使用Hibernate批量保持联系

时间:2015-07-23 20:47:37

标签: java hibernate jpa orm spring-data-jpa

我有一个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。

0 个答案:

没有答案