Сразу проблема заключается в сохранении объекта 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
«s persist
метод.
Вот какой журнал:
Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?)
com.mysql.jdbc.JDBC4PreparedStatement@15724a0: 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`)
)
Ответы:
Чтобы использовать
AUTO_INCREMENT
столбец MySQL , вы должны использоватьIDENTITY
стратегию:Вот что вы получите при использовании
AUTO
с MySQL:Что на самом деле эквивалентно
Другими словами, ваше отображение должно работать. Но Hibernate должен опускать
id
столбец в операторе вставки SQL, а это не так. Где-то должно быть какое-то несоответствие.Вы указали диалект MySQL в конфигурации Hibernate (возможно,
MySQL5InnoDBDialect
илиMySQL5Dialect
зависимости от используемого движка)?Кроме того, кто создал таблицу? Можете показать соответствующий DDL?
Продолжение: я не могу воспроизвести вашу проблему. Используя код вашей сущности и вашего DDL, Hibernate генерирует следующий (ожидаемый) SQL с MySQL:
Обратите внимание, что
id
столбец отсутствует в приведенном выше заявлении, как и ожидалось.Подводя итог, ваш код, определение таблицы и диалект правильные и согласованные, он должен работать. Если это не для вас, возможно, что-то не синхронизировано (выполните чистую сборку, дважды проверьте каталог сборки и т. Д.) Или что-то еще не так (проверьте журналы на наличие чего-либо подозрительного).
Что касается диалекта, единственная разница между
MySQL5Dialect
илиMySQL5InnoDBDialect
заключается в том, что последний добавляетENGINE=InnoDB
к таблице объекты при генерации DDL. Использование того или другого не меняет сгенерированный SQL.источник
@GeneratedValue(strategy=GenerationType.IDENTITY)
когда пишете@GeneratedValue(strategy=GenerationType.AUTO)
и@GeneratedValue
. Так что будьте осторожны и постарайтесь быть многословным.Используя MySQL, у меня работал только этот подход:
Другие 2 подхода, заявленные Паскалем в его ответе, не работали для меня.
источник
JPA
сspring-boot
иMySQL
.Для тех, кто читает это и использует EclipseLink для JPA 2.0, вот две аннотации, которые мне пришлось использовать, чтобы заставить JPA сохранять данные, где «MySequenceGenerator» - любое имя, которое вы хотите дать генератору, «myschema» - это имя схема в вашей базе данных, которая содержит объект последовательности, а «mysequence» - это имя объекта последовательности в базе данных.
Для тех, кто использует EclipseLink (и, возможно, других поставщиков JPA), ВАЖНО, чтобы вы установили атрибут allocationSize в соответствии со значением 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 с помощью мастеров для генерации сущностей из БД, контроллеров из сущностей и JSF из сущностей, а мастера (очевидно) не знают, как работать со столбцами идентификаторов на основе последовательностей, поэтому вам придется вручную добавить эти аннотации.
источник
источник
Если вы используете Mysql с Hibernate v3, его можно использовать,
GenerationType.AUTO
потому что внутри он будет использоватьGenerationType.IDENTITY
, что является наиболее оптимальным для MySQL.Однако в Hibernate v5 это изменилось.
GenerationType.AUTO
будет использоватьGenerationType.TABLE
который генерирует много запросов для вставки.Вы можете избежать этого, используя
GenerationType.IDENTITY
(если MySQL - единственная база данных, которую вы используете) или с этими обозначениями (если у вас несколько баз данных):источник
Я пробовал все, но все равно не смог этого сделать, я использую mysql, jpa с hibernate, я решил свою проблему, присвоив значение id 0 в конструкторе. Ниже приведен мой код объявления id.
источник
Поскольку вы определили идентификатор в типе int при создании базы данных, вы также должны использовать тот же тип данных в классе модели. И поскольку вы определили идентификатор для автоматического увеличения в базе данных, вы должны упомянуть его в классе модели, передав значение GenerationType.AUTO в атрибут «стратегия» в аннотации @GeneratedValue. Тогда код станет таким, как показано ниже.
источник
так же, как ответил паскаль, просто если вам по какой-то причине нужно использовать .AUTO, вам просто нужно добавить в свойства вашего приложения:
источник
Можете ли вы проверить, подключились ли вы к правильной базе данных. поскольку я столкнулся с той же проблемой, но, наконец, обнаружил, что подключился к другой базе данных.
identity поддерживает столбцы идентичности в DB2, MySQL, MS SQL Server, Sybase и HypersonicSQL. Возвращаемый идентификатор имеет тип long, short или int.
Дополнительная информация: http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/mapping.html#mapping-declaration-id
источник
Если вы используете MariaDB, это будет работать
Для получения дополнительной информации вы можете проверить https://thorben-janssen.com/hibernate-tips-use-auto-incremented-column-primary-key/
источник