Hibernate Авто Инкремент ID - PullRequest
       14

Hibernate Авто Инкремент ID

75 голосов
/ 06 января 2010

У меня есть приложение j2ee, использующее спящий режим с аннотацией.Как мне аннотировать поле Id в моем классе pojo, чтобы установить его как автоинкремент или автоматически генерируемый.и, добавляя бин, я оставляю это поле в нуле?

Ответы [ 7 ]

143 голосов
/ 06 января 2010
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

и вы оставляете его null (0) при сохранении. (null, если вы используете Integer / Long оболочки)

В некоторых случаях стратегия AUTO разрешается до SEQUENCE, а не IDENTITY или TABLE, поэтому вы можете вручную установить ее на IDENTITY или TABLE (в зависимости от базовой базы данных ).

Кажется, SEQUENCE + с указанием имени последовательности сработало для вас.

31 голосов
/ 19 апреля 2012

Сделайте это следующим образом: -

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

Вы можете использовать любое произвольное имя вместо kaugen. Это работало хорошо, я мог видеть ниже запросы на консоли

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
7 голосов
/ 25 августа 2014

Hibernate определяет пять типов стратегий генерации идентификаторов:

AUTO - столбец идентификатора, последовательность или таблица в зависимости от базовой БД

TABLE - таблица с идентификатором

ИДЕНТИЧНОСТЬ - столбец идентификации

ПОСЛЕДОВАТЕЛЬНОСТЬ - последовательность

копия удостоверения личности - удостоверение личности копируется из другого объекта

Пример использования таблицы

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

для более подробной информации, проверьте ссылку .

6 голосов
/ 27 июля 2012

FYI

Используя netbeans Новые классы сущностей из базы данных со столбцом mysql * auto_increment *, создается атрибут со следующими аннотациями:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

Это приводило меня к ошибке, в которой сообщалось, что столбец не должен быть нулевым, поэтому я просто удалил аннотацию @NotNull, оставив атрибут пустым, и это работает!

4 голосов
/ 04 февраля 2011

Если у вас есть числовой столбец, который вы хотите автоматически увеличивать, возможно, вам будет предложено установить columnDefinition напрямую. Преимущество заключается в том, что схема автоматически генерирует значение, даже если оно используется без спящего режима. Это может сделать ваш код специфичным для БД:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
0 голосов
/ 03 мая 2019

Использование netbeans Новые классы сущностей из базы данных со столбцом mysql auto_increment создают атрибут со следующим hibernate.hbm.xml: id - автоинкремент

0 голосов
/ 27 марта 2019

В случае, если кто-то «столкнется» с этим вопросом SO в поиске стратегий для таблицы Informix , когда PK имеет тип Serial .

Я обнаружил, что это работает ... как пример.

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

Чтобы это работало, убедитесь, что при выполнении session.SaveOrUpdate вы передаете значение для столбца special_serial_pk NULL .

В моем случае я делаю HTML POST с JSON вот так ...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}
...