У мене є програма j2ee з використанням режиму глибокого сну з анотацією. Як мені помітити поле Id у своєму класі pojo, щоб встановити його як автоматичне збільшення або автоматичне створення. і додаючи bean, я залишаю це поле в моєму bean null?
Відповіді:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
і ви залишаєте його null
( 0
), коли зберігаєтеся. ( null
якщо ви використовуєте Integer
/Long
обгортки)
У деяких випадках AUTO
стратегію вирішують як SEQUENCE
непередбачувану, ніж, IDENTITY
або TABLE
, тому вам може знадобитися вручну встановити її на IDENTITY
або TABLE
(залежно від базової бази даних).
Здається SEQUENCE
+ вказівка назви послідовності працювала для вас.
Зробіть це наступним чином: -
@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 (?, ?, ?, ?, ?)
FYI
Використання Netbeans New Entity Classes з бази даних зі стовпцем mysql * auto_increment * створює вам атрибут із такими анотаціями:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;
Це призвело до тієї ж помилки, що стовпець не повинен бути нульовим, тому я просто видалив анотацію @NotNull, залишаючи атрибут нульовим, і це працює!
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;
для отримання детальної інформації перевірте посилання .
Якщо у вас є числовий стовпець, який ви хочете автоматично збільшити, можливо, його можна встановити columnDefinition
безпосередньо. Це має ту перевагу, що схема автоматично генерує значення, навіть якщо воно використовується без сплячого режиму. Це може зробити ваш код db-специфічним, хоча:
import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
На випадок, якщо хтось "зіткнеться" з цим запитанням 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
}
Використовуючи netbeans New Entity Classes from Database зі стовпцем mysql auto_increment , ви створюєте атрибут із таким hibernate.hbm.xml: id є автоматичним збільшенням