Почему JPA не генерирует автоматически идентификатор для моих строк? - PullRequest
3 голосов
/ 26 декабря 2011

Я хочу использовать стратегию SEQUENCE для автоматического создания идентификаторов, но я ломаю голову, чтобы она заработала. Я вообще не знаю, почему я не могу это сделать.

Это то, что я делаю. Сначала у меня есть сущность:

 @Entity
@SequenceGenerator(name="VlasnikSeq", sequenceName="VLA_SEQ")
public class Vlasnik implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="VlasnikSeq")
    private Long id;
    //...

в файле persistence.xml он сопоставлен:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="sampleAplication">
    <class>entities.Vlasnik</class>
    <class>entities.Ljubimac</class>
    </persistence-unit>
</persistence>

Когда я использую функцию затмений для генерации таблиц для сущностей, я получаю это:

enter image description here

Как видите, таблицы созданы, но таблицы SEQUENCE нет. Я также заметил в консоли следующее сообщение, когда JPA создавал таблицы:

[Предупреждение EL]: Исключение [EclipseLink-4002] (Постоянство Eclipse Услуги - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Internal Исключение: java.sql.SQLSyntaxErrorException: SEQUENCE 'VLA_SEQ' делает не существует.

Следующее, что я думаю, это попытка запустить приложение и посмотреть, смогу ли я создать несколько строк. Но когда я пытаюсь что-то упорствовать, я получаю исключение, которое говорит:

org.apache.derby.client.am.SqlException: SEQUENCE 'VLA_SEQ' не

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

CREATE SEQUENCE VLA_SEQ;

Но я получаю следующее сообщение:

Последовательность 'VLA_SEQ' уже существует.

Я полностью сбит с толку. Я не знаю, что мне делать. Я просто хочу автоматически генерировать идентификаторы моих сущностей при создании новой строки в БД.

Впервые я использую Glassfish 3.1, в версии 3.0, я не помню, имея эту проблему, я мог бы даже использовать только @GenneratedValue. Я буду признателен за помощь.

1 Ответ

7 голосов
/ 26 декабря 2011

Для использования GeneratedValue необходимо указать стратегию и генератор.По умолчанию используется стратегия AUTO , а генератор - пусто .

Доступные стратегии определяются как GenerationType :

public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };

Наиболее распространенный способ его использования - указать SEQUENCE или IDENTITY .

  • Для баз данных, использующих SEQUENCE , таких как Oracle и HSQLDB, вы также должны использовать SequenceGenerator аннотация:

    открытый класс MyClass {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQMYCLASSID")
    @SequenceGenerator(name="SEQMYCLASSID", sequenceName="SEQMYCLASSID")
    private Long id;
    

    }

Если у вас есть автоматическое включение DDL, вам не нужно создавать последовательность, потому что поставщик JPA сделает это за вас.Если это не так, вы должны сделать это вручную следующим образом:

CREATE SEQUENCE SEQMYCLASSID;
  • Для баз данных, которые не используют последовательности и используют столбцы идентификаторов, такие как Microsoft SQL Server, вам нужно указать IDENTITY как стратегия:

    открытый класс MyClass {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)  
    private Long id;
    

    }

...