Tôi có một ứng dụng j2ee sử dụng chế độ ngủ đông với chú thích. Làm cách nào để chú thích trường Id trong lớp pojo của tôi để đặt nó làm tăng tự động hoặc tự động tạo. và khi thêm bean, tôi có để lại trường đó trong bean null không?
Câu trả lời:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
và bạn rời khỏi nó null
( 0
) khi kiên trì. ( null
nếu bạn sử dụng Integer
/ Long
wrappers)
Trong một số trường hợp, AUTO
chiến lược được giải quyết thành SEQUENCE
rathen hơn là IDENTITY
hoặc TABLE
, vì vậy bạn có thể muốn đặt nó theo cách thủ công thành IDENTITY
hoặc TABLE
(tùy thuộc vào cơ sở dữ liệu bên dưới).
Có vẻ như SEQUENCE
+ chỉ định tên trình tự phù hợp với bạn.
Thực hiện như sau: -
@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
public Integer getId() {
return id;
}
Bạn có thể sử dụng bất kỳ tên tùy ý nào thay vì kaugen. Nó hoạt động tốt, tôi có thể thấy các truy vấn bên dưới trên bảng điều khiển
Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname, proj_id) values (?, ?, ?, ?, ?)
FYI
Sử dụng netbeans Lớp thực thể mới từ Cơ sở dữ liệu với cột mysql * auto_increment *, tạo cho bạn một thuộc tính với các chú thích sau:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;
Điều này khiến tôi gặp phải lỗi tương tự khi nói rằng cột không được rỗng, vì vậy tôi chỉ cần xóa chú thích @NotNull để lại thuộc tính là null và nó hoạt động!
Hibernate xác định năm loại chiến lược tạo mã nhận dạng:
AUTO - cột nhận dạng, chuỗi hoặc bảng tùy thuộc vào DB bên dưới
TABLE - bảng chứa id
IDENTITY - cột nhận dạng
SEQUENCE - trình tự
bản sao danh tính - danh tính được sao chép từ một thực thể khác
Ví dụ sử dụng Bảng
@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;
để biết thêm chi tiết, hãy kiểm tra liên kết .
Nếu bạn có một cột số mà bạn muốn tự động tăng lên, đó có thể là một tùy chọn để đặt columnDefinition
trực tiếp. Điều này có lợi thế là lược đồ tự động tạo giá trị ngay cả khi nó được sử dụng mà không có chế độ ngủ đông. Mặc dù vậy, điều này có thể làm cho mã của bạn trở thành db cụ thể:
import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
Trong trường hợp ai đó "đụng" vào câu hỏi SO này để tìm kiếm các chiến lược cho bảng Informix khi PK là kiểu Serial .
Tôi đã thấy rằng điều này hoạt động ... như một ví dụ.
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;
Để điều này hoạt động, hãy đảm bảo khi bạn thực hiện session.SaveOrUpdate bạn chuyển giá trị cho cột special_serial_pk NULL .
Trong trường hợp của tôi, tôi thực hiện một BÀI ĐĂNG HTML với JSON như vậy ...
{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}
Sử dụng netbeans Các lớp thực thể mới từ Cơ sở dữ liệu với cột tự động_tự_động_của_mai , tạo cho bạn một thuộc tính với hibernate.hbm.xml sau: id là tự động tăng