Hibernate имеет проблемы с объектом последовательности - не может вызвать следующий val - PullRequest
0 голосов
/ 28 августа 2018

Я использую спящий объект и генератор последовательностей вместе с ним.

Моя база данных - Oracle 12c.

В моем генераторе последовательностей - он выбирает значение, которое уже присутствует в таблице.

Я попытался разыскать проблему - нашел одну похожую тему Последовательность гибернации nextVal разрешена, но не используется (Oracle)

Но все равно это не помогло. Проблема, с которой я столкнулся, заключается в том, что она работает несколько раз и иногда не работает

Ниже приведен фрагмент кода -

@Entity
@Table(name="TABLE_NAME", schema = "SCHEMA")
@SequenceGenerator(name="TABLE_ID_SEQ_GEN", sequenceName="SCHEMA.TABLE_ID_SEQ",allocationSize=1)
public class ImportTransactionDataEntity {

    @Id
    @Column(name="TABLE_ID",unique=true,nullable=false)
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="TABLE_ID_SEQ_GEN" )
    private int IDColumnPk;

Любая помощь приветствуется, спасибо :)

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Согласно документации Oracle, @SequenceGenerator следует добавлять в поле, а не в класс:

https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/cmp30cfg001.htm#BCGGHADG

так что-то вроде:

@Entity
@Table(name="TABLE_NAME", schema = "SCHEMA")

public class ImportTransactionDataEntity {

    @Id
    @Column(name="TABLE_ID",unique=true,nullable=false)
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="TABLE_ID_SEQ_GEN" )
    @SequenceGenerator(name="TABLE_ID_SEQ_GEN", sequenceName="SCHEMA.TABLE_ID_SEQ",allocationSize=1)
    private int IDColumnPk;

Это работает для меня.

0 голосов
/ 30 августа 2018

ну, наконец - я пришел к решению, что я уже использую oracle 12 C - решил пойти со столбцом Identity на самой таблице.

ПРИМЕЧАНИЕ - но столбец идентификаторов недоступен до Oracle 12c.

В итоге я получил лучшую производительность и с некоторой долей, так что эта работа стала для меня вздохом облегчения

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TABLE_ID", updatable = false, nullable = false)
private int IDColumnPk;
0 голосов
/ 28 августа 2018

попробуйте

@Entity
@Table(name="TABLE_NAME")
@SequenceGenerator(name="TABLE_ID_SEQ_GEN",sequenceName="TABLE_ID_SEQ",allocationSize=1)
public class ImportTransactionDataEntity {

@Id
@Column(name="TABLE_ID",unique=true,nullable=false)
@GeneratedValue(strategy=GenerationType.AUTO,generator="TABLE_ID_SEQ_GEN" )
private int IDColumnPk;

он хранится в вашей базе данных следующим образом: последний номер - это последний использованный идентификатор, так что не беспокойтесь о потере счетчика, потому что база данных сделает это за вас

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...