Как аннотировать поле автоинкремента MYSQL с аннотациями JPA

Прямо к сути, проблема заключается в том, чтобы сохранить объект Operator в MySQL DB. Перед сохранением, я пытаюсь выбрать из этой таблицы, и он работает, так же как и соединение с db.

Вот мой объект Operator:

@Entity public class Operator{ @Id @GeneratedValue private Long id; private String username; private String password; private Integer active; //Getters and setters... } 

Чтобы сохранить, я использую метод сохранения JPA EntityManager .

Вот несколько журналов:

 Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?) com.mysql[email protected]: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **) 

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

Пробовал некоторые трюки, которые я видел здесь: Hibernate не уважает первичное ключевое поле MySQL auto_increment. Но ничего из этого не получилось.

Если вам нужны другие файлы конфигурации, я их предоставлю.

DDL:

 CREATE TABLE `operator` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `first_name` VARCHAR(40) NOT NULL, `last_name` VARCHAR(40) NOT NULL, `username` VARCHAR(50) NOT NULL, `password` VARCHAR(50) NOT NULL, `active` INT(1) NOT NULL, PRIMARY KEY (`id`) ) 

Чтобы использовать столбец MySQL AUTO_INCREMENT , вы должны использовать страtagsю IDENTITY :

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

Это то, что вы получите при использовании AUTO с MySQL:

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

Это на самом деле эквивалентно

 @Id @GeneratedValue private Long id; 

Другими словами, ваше картографирование должно работать. Но Hibernate должен опустить столбец id в инструкции SQL insert, и это не так. Там должно быть какое-то несоответствие.

Вы указали MySQL5InnoDBDialect MySQL в своей конфигурации Hibernate (возможно, MySQL5InnoDBDialect или MySQL5Dialect зависимости от используемого вами движка)?

Кроме того, кто создал таблицу? Вы можете показать соответствующий DDL?

Последующие действия: я не могу воспроизвести вашу проблему. Используя код вашей сущности и ваш DDL, Hibernate генерирует следующий (ожидаемый) SQL с MySQL:

 insert into Operator (active, password, username) values (?, ?, ?) 

Обратите внимание, что столбец id отсутствует в приведенном выше выражении, как и ожидалось.

Подводя итог, ваш код, определение таблицы и диалект являются правильными и согласованными, они должны работать. Если это не для вас, возможно, что-то не синхронизировано (выполните чистую сборку, дважды проверьте каталог сборки и т. Д.) Или что-то еще не так (проверьте журналы на что-нибудь подозрительное).

Что касается диалекта, единственная разница между MySQL5Dialect или MySQL5InnoDBDialect заключается в том, что позже добавляет ENGINE=InnoDB к объектам таблицы при генерации DDL. Использование одного или другого не изменяет сгенерированный SQL.

Используя MySQL, для меня работал только этот подход:

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

Другие 2 подхода, заявленные Паскалем в его ответе, не работали для меня.

Для тех, кто читает это, кто использует EclipseLink для JPA 2.0, вот две annotations, которые мне пришлось использовать, чтобы получить JPA для сохранения данных, где «MySequenceGenerator» – это то, что вы хотите дать генератору, «myschema» – это имя схема в вашей базе данных, которая содержит объект последовательности, а «mysequence» – это имя объекта последовательности в базе данных.

 @GeneratedValue(strategy= GenerationType.SEQUENCE, generator="MySequenceGenerator") @SequenceGenerator(allocationSize=1, schema="myschema", name="MySequenceGenerator", sequenceName = "mysequence") 

Для тех, кто использует EclipseLink (и, возможно, другие поставщики JPA), CRITICAL устанавливает атрибут allocSize в соответствие с значением INCREMENT, определенным для вашей последовательности в базе данных. Если вы этого не сделаете, вы получите общий упор на провал и потратите много времени, пытаясь отследить его, как я. Вот справочная страница, которая помогла мне преодолеть эту проблему:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects

Кроме того, чтобы дать контекст, вот что мы используем:

Java 7 Glassfish 3.1 PostgreSQL 9.1 PrimeFaces 3.2 / JSF 2.1

Кроме того, для лени, я построил это в Netbeans с помощью мастеров для создания Entities из DB, controllerов из Entities и JSF из Entities, а мастера (очевидно) не знают, как обращаться с столбцами идентификаторов на основе последовательностей, поэтому вам придется вручную добавить эти annotations.

Убедитесь, что тип данных id длинный, а не String, если это будет строка, то аннотация @GeneratedValue не будет работать, а sql-генерация для

 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private String id; create table VMS_AUDIT_RECORDS (id **varchar(255)** not null auto_increment primary key (id)) 

это должно быть

 create table VMS_AUDIT_RECORDS (id **bigint** not null auto_increment primary key (id)) 

Я пробовал все, но все же я не мог этого сделать, я использую mysql, jpa с hibernate, я решил свою проблему, присвоив значение id 0 в конструкторе. Ниже приведен код моей идентификационной декларации

 @Id @Column(name="id",updatable=false,nullable=false) @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; 
  • Сохранение карты с использованием JPA
  • Объекты ORM и сущности домена в Entity Framework 6.0
  • Каковы преимущества использования ORM?
  • Родные запросы JPA / Hibernate не распознают параметры
  • @Basic (необязательно = false) vs @Column (nullable = false) в JPA
  • Перечисление в спящем режиме, сохраняющееся как перечисление
  • Почему вы должны использовать ORM?
  • Как использовать Hibernate @ Любые связанные annotations?
  • В чем разница между persist () и merge () в Hibernate?
  • LINQ To Entities не распознает метод Last. В самом деле?
  • Что используется session.flush () в Hibernate
  • Interesting Posts

    Рекурсивные структуры данных в ржавчине

    Как я могу менять цвета терминала GNOME каждый раз, когда он запускается?

    Перемещение по массивам с помощью встроенной сборки

    Как получить размер UIKeyboard с Apple iPhone SDK

    Как определить завершенный процесс Windows, если у меня все еще есть его PID?

    Как конвертировать datetime в timestamp с помощью C # /. NET (игнорируя текущий часовой пояс)

    Разделительный туннель и Cisco AnyConnect

    Реализация -hash / -isEqual: / -isEqualTo …: для коллекций Objective-C

    Использование заголовка диапазона HTTP с спецификатором диапазона, отличным от байтов?

    Обязательный @QueryParam в JAX-RS (и что делать в их отсутствие)

    Существуют ли жизнеспособные альтернативы шаблону Singleton в GOF?

    Каковы общие соглашения об использовании пространств имен в Clojure?

    byte в hex string

    В чем разница между динамическим прокси JDK и CGLib?

    Spring 4.x / 3.x (веб-MVC) REST API и JSON2 Почтовые запросы, как правильно это сделать один раз для всех?

    Давайте будем гением компьютера.