#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.