Ідентифікатор автоматичного збільшення режиму глибокого сну


85

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

Відповіді:


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

і ви залишаєте його null( 0), коли зберігаєтеся. ( nullякщо ви використовуєте Integer/Long обгортки)

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

Здається SEQUENCE+ вказівка ​​назви послідовності працювала для вас.


мій ідентифікатор має тип string. що я йому встановлю. Тому що я отримую цю помилку. Викликано: javax.el.ELException: org.hibernate.exception.SQLGrammarException: не вдалося отримати наступне значення послідовності
cedric

4
автоінкремент означає, що це число, яке збільшується. Рядок не можна збільшити. Зробіть колонку int
Божо

myid у базі даних має номер типу. І я вже змінив ідентифікатор у своєму pojo на int. я розумію, що послідовність помилок не існує
cedric

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

2
Не використовуйте ідентичність, Oracle не підтримує ідентичність, вона підтримує послідовність.
JuanZe

33

Зробіть це наступним чином: -

@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 (?, ?, ?, ?, ?)

Цей працює для мене. Але це не дозволяє мені встановлювати значення ідентифікатора. Я намагався встановити id з цілими числами або int, але він використовує max в будь-який час. Що я повинен зробити?
desudesudesu

використовуйте @GenericGenerator (name = "incrementId", strategy = "assign") @GeneratedValue (generator = "incrementId"). Це дозволить вам встановити ідентифікатор самостійно. Але якщо ви не передасте ідентифікатор, це буде 0.
Ravi Kant

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

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

10

FYI

Використання Netbeans New Entity Classes з бази даних зі стовпцем mysql * auto_increment * створює вам атрибут із такими анотаціями:

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

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


7

Hibernate визначає п’ять типів стратегій генерації ідентифікаторів:

AUTO - стовпець ідентичності, послідовність або таблиця залежно від базової бази даних

ТАБЛИЦЯ - таблиця, що містить ідентифікатор

ІДЕНТИЧНОСТЬ - стовпець ідентичності

ПОСЛІДОВНІСТЬ - послідовність

копія посвідчення - посвідчення копіюється з іншої сутності

Приклад використання таблиці

@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безпосередньо. Це має ту перевагу, що схема автоматично генерує значення, навіть якщо воно використовується без сплячого режиму. Це може зробити ваш код db-специфічним, хоча:

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 New Entity Classes from Database зі стовпцем mysql auto_increment , ви створюєте атрибут із таким hibernate.hbm.xml: id є автоматичним збільшенням

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.