SequenceGenerator генерирует отрицательные значения и создает исключение EntityExistsException - PullRequest
0 голосов
/ 18 октября 2018

Я определил свой компонент Entity следующим образом

public class Person implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PERSON_SEQ")
@SequenceGenerator(name="PERSON_SEQ", sequenceName="PERSON_SID_SEQ")
@Column(name = "PERSON_SID")
private BigDecimal personSid;

Я использую загрузочное приложение Spring-data-jpa 2.0.5 с базой данных Oracle 12C.Наша последовательность БД определена как

CREATE SEQUENCE  "PERSON_SID_SEQ"  MINVALUE 1 MAXVALUE 
9999999999999999999999999999 INCREMENT BY 1 START WITH 1

Мое приложение должно вставлять огромное количество записей, около 6000 или более на каждый запрос, и я могу получать параллельные запросы такого объема.Чтобы включить массовую вставку, у меня есть несколько настроек

spring.jpa.properties.hibernate.jdbc.batch_size=50
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true

Я также использую jpaRepository.saveAll () для каждых 50 записей и вызываю flush () после каждых 50 записей.Однако, когда я использую генератор последовательности, как определено выше, я вижу только один

select person_sid_seq.nextval from dual

, за которым следуют 50 операторов вставки.Но в конечном итоге происходит сбой за исключением

javax.persistence.EntityExistsException: A different object with the same 
identifier value was already associated with the session : 
[com.sample.Person#1]

, и не только это, я также замечаю, что генерируемые порядковые номера являются отрицательными значениями.Как будто они не из Person_sid_seq

Я вижу то же поведение, когда вместо saveAll () используется метод save ().

Но если я удаляю @SequenceGenerator и @GeneratedValue,и установить идентификатор перед вызовом сохранения, я не вижу никаких проблем с постоянством (конечно, замечая выбор перед каждой вставкой, не знаю почему).

Но я не намерен назначать идентификатор явно и разрешать DB иJPA позаботится об этом автоматически.

1) По каким причинам возвращаемые порядковые номера являются отрицательными?Я что-то пропустил?2) Почему возникает исключение (EntityExistsException), когда полагается на БД, чтобы присвоить мне уникальное значение из последовательности.Может быть ответ на 1, также ответит на это 3) При программной установке идентификатора, почему вызывается дополнительный выбор.?

Не могли бы вы помочь мне понять это?

Спасибо

...