Как аннотировать поле автоинкремента 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
.
- Любые хорошие инструменты ORM для разработки Android?
- В чем разница между JPA и Hibernate?
- Вычисленное свойство с JPA / Hibernate
- JPQL Создать новый объект в Select Statement - избегать или объявлять?
- Можно ли создавать модели django из базы данных?
Вот несколько журналов:
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`) )
- Entity Framework слишком медленная. Какие у меня варианты?
- Я обнаружил, что JPA, или, похоже, не поощряет шаблон DAO
- Что такое ленивая загрузка в Hibernate?
- Примитив или shell для первичных ключей спящего режима
- Почему django prefetch_related () работает только со всеми (), а не с фильтром ()?
- Hibernate, iBatis, Java EE или другой инструмент Java ORM
- Нарушение спящего режима с помощью orphanRemoval
- Какую Java ORM вы предпочитаете и почему?
Чтобы использовать столбец 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;