JPA: идентификатор автоматического увеличения с базой данных Oracle

Я определяю Entity со значением Generated Id, но когда я пытаюсь выполнить вставку, я получаю эту ошибку:

    10:33:32,202 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-8) SQL Error: 2289, SQLState: 42000
    10:33:32,203 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-8) ORA-02289: sequence does not exist
    10:33:32,205 ERROR [org.jboss.as.ejb3.invocation] (default task-8) WFLYEJB0034: EJB Invocation failed on component  javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist

Юридическое лицо :

@Entity
@Table(name = "TYPEDEM")
public class TypeDem {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID")
    private long id;
    @Column(name = "CODE")
    private String code;
    @Column(name = "LABEL")
  ..
}

Класс:

@Override
    public TypeDem save(TypeDem typeDem) {
        entityManager.persist(typeDem);
        return typeOfDemand;
    }

В отладке я вижу, что значение id равно null


person user1814879    schedule 14.08.2017    source источник
comment
см. stackoverflow.com/questions/20603638/   -  person Scary Wombat    schedule 14.08.2017
comment
Нет, Oracle НЕ поддерживает автоинкремент, поэтому вы не можете использовать с ним стратегию IDENTITY. Однако я ожидал, что ваш провайдер JPA скажет вам это, а не просто использует NULL! Возможно, вам следует поднять на нем ошибку.   -  person Neil Stockton    schedule 14.08.2017
comment
какова последовательность, которую вы хотите использовать для генерации идентификатора. Он создан в вашей схеме БД   -  person Harish Barma    schedule 14.08.2017


Ответы (2)


генератор идентификационных данных

Он используется в Sybase, My SQL, MS SQL Server, DB2 и HypersonicSQL для поддержки столбца id. Возвращаемый идентификатор имеет тип short, int или long.

Тип IDENTITY (включенный в стандарт SQL:2003) поддерживается:

SQL Server MySQL (AUTO_INCREMENT) DB2 HSQLDB Генератор IDENTITY позволяет автоматически увеличивать столбец типа integer/bigint по запросу. Процесс увеличения происходит за пределами текущей выполняемой транзакции, поэтому откат может привести к отбрасыванию уже присвоенных значений (могут возникнуть пропуски значений).

Для Oracle используйте приведенный ниже код @GeneratedValue(strategy=GenerationType.AUTO).

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID")
person Sudhakar    schedule 14.08.2017
comment
Спасибо, но когда я использую AUTO, я получаю ту же ошибку. - person user1814879; 14.08.2017

Ваше решение верное.

Единственная проблема заключается в том, что hibernate.hbm2ddl.auto не настроен на обновление. Пожалуйста, используйте обновление. Будьте очень осторожны при использовании create или create-drop.

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist

Это явно указывает на то, что последовательность отсутствует в базе данных.

person user1615664    schedule 14.08.2017
comment
Его решение неверно. Он выбрал стратегию ИДЕНТИЧНОСТИ. IDENTITY должен представлять столбец идентификаторов ... на языке RDBMS это AUTO_INCREMENT или тип столбца SERIAL. У Oracle такой поддержки нет. Спецификация JPA также говорит, что IDENTITY нельзя переносить во все хранилища данных. Если он хочет использовать последовательность, он должен выбрать стратегию ПОСЛЕДОВАТЕЛЬНОСТЬ. - person Neil Stockton; 14.08.2017