Идентификатор автоинкремента гибернации


86

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

Ответы:


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

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

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

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


мой идентификатор имеет тип строки. что я ему поставлю. Потому что я получаю эту ошибку. Вызвано: javax.el.ELException: org.hibernate.exception.SQLGrammarException: не удалось получить следующее значение последовательности
cedric

4
autoincrement означает, что это число, которое увеличивается. Строка не может быть увеличена. Сделать столбец int
Божо

Столбец myid в базе данных имеет номер типа. И я уже изменил свой идентификатор в моем pojo на int. я получаю, что последовательность ошибок не существует
Седрик

2
Для Oracle SEQUENCE ближе всего к автоинкременту. Вы должны создать последовательность заранее, если только вы не разрешаете Hibernate генерировать вашу схему. Если вы думаете, что в какой-то момент сможете поддерживать несколько баз данных, используйте TABLE.
Брайан Детерлинг, 06

2
Не используйте идентичность, Oracle не поддерживает идентичность, он поддерживает последовательность.
JuanZe 06

33

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

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

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

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)

Этот мне подходит. Но это не позволяет мне установить значение ID. Я пытался установить ID с целыми числами или int, но он всегда использует max. Что я должен делать?
desudesudesu

используйте @GenericGenerator (name = "incrementId", strategy = "assign") @GeneratedValue (generator = "incrementId"). Это позволит вам установить идентификатор самостоятельно. Но если вы не передадите идентификатор, он будет равен 0.
Рави Кант

@Kaushik Lele Является ли стратегия = "приращение" встроенным приращением приращения в спящий режим? Подпадает ли он под какую из этих ПОСЛЕДОВАТЕЛЬНОСТЕЙ, ИДЕНТИЧНОСТИ, АВТО, ТАБЛИЦА?
чувствую себя хорошо и программирование

Как насчет 700 миллионов записей в таблице? Я думаю, это может быть проблема без индекса
user2171669

10

К вашему сведению

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

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

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


7

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

АВТО - столбец идентичности, последовательность или таблица в зависимости от базовой БД

ТАБЛИЦА - таблица с идентификатором

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

SEQUENCE - последовательность

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

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

@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;

подробности по ссылке .


4

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

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql

MySQL - это @Column (columnDefinition = "integer auto_increment")
yeralin

1

На случай, если кто-то «наткнется» на этот вопрос 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
}

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.