Увеличение размера распределения порождает исключение NonUniqueObjectException

#java #hibernate #jpa

#java #спящий режим #jpa

Вопрос:

Я пытаюсь вставить в свою базу данных (Oracle) коллекцию Mother объектов, у которых есть список Child объектов. Все идентификаторы этих объектов генерируются с использованием последовательности:

 @Entity
@Table(name = "MOTHER")
public class Mother implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_MOTHER")
    @SequenceGenerator(name="SEQ_MOTHER", allocationSize=100)  //Error?!?
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "mother", 
               orphanRemoval = true)
    private List<Child> children;    
}
  

Я довольно просто вставляю несколько тысяч Mother экземпляров благодаря persist методу:

     for (Mother mother : mothersToInsert) {
        entityManager.persist(mother);
    }
  

В моей модели, если я не задаю никаких allocationSize значений (по умолчанию 50 согласно документации) или устанавливаю для него значение меньше 50, тогда все работает нормально.

Тем не менее, если я попытаюсь установить его на 100 или более, тогда у меня будет NonUniqueObjectException :

 javax.persistence.PersistenceException: org.hibernate.NonUniqueObjectException: 
    a different object with the same identifier value was already associated with 
    the session
  

«Решением» может быть изменение Cascade (я не пытался его изменить), но я хотел бы сохранить все дочерние экземпляры при сохранении материнских экземпляров (и их извлечении …)

Возможно, мне не нужно устанавливать alocationSize высокое значение, но как я могу увеличить его, чтобы повысить производительность вставок без получения этого исключения? И как быть уверенным, что даже если оно не установлено, ошибка где-то не скрыта?

Ответ №1:

Вы должны установить allocationSize для генератора то же значение, что и «УВЕЛИЧИТЬ НА» в вашей последовательности. Прочтите это для получения дополнительной информации о последовательности с помощью JPA.