Tôi nghĩ câu trả lời được chấp nhận từ Petar là không đúng, hoặc không còn đúng nữa. Số tự động tăng trong Postgres được xử lý thông qua SERIAL
loại giả, điều đó chính xác. Tuy nhiên, ánh xạ mà Petar đưa ra sẽ dẫn đến DDL sau đây được tạo bởi Hibernate 5.1:
CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
Điều này không sử dụng SERIAL
, nhưng là một trình tự được quản lý Hibernate. Nó không thuộc sở hữu của bảng và không có giá trị mặc định nào được đặt. Tất nhiên, tạo DDL là một tính năng mà nhiều người không sử dụng trong sản xuất (nhưng nhiều người lấy mã được tạo làm mẫu).
Nếu bạn viết tay DDL của mình và thực sự sử dụng SERIAL
, sau đó sử dụng GenerationType.SEQUENCE
thậm chí có thể xung đột với hành vi cơ sở dữ liệu. Cách chính xác để ánh xạ Hibernate với chiến lược ID ưa thích của Postgres là sử dụng GenerationType.IDENTITY
. Ngẫu nhiên, mã cũng ngắn hơn và dễ đọc hơn nhiều:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;