Tôi cũng có một projet trong đó Oracle DB cung cấp dữ liệu cho các lớp @Entity của tôi. Như bạn đã nói, một chuỗi tạo id cho PK của bảng thông qua một trình kích hoạt. Đây là các chú thích mà tôi đã sử dụng trong một trong các lớp sau:
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "G1")
@SequenceGenerator(name = "G1", sequenceName = "LOG_SEQ")
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
public int getId() {
return this.id;
}
Đây là cú pháp thứ hai mà bạn đã hiển thị trong bài đăng của mình. Không có lệnh gọi đến trình kích hoạt trong mã Java vì trình kích hoạt được quản lý bởi DB. Tôi nhớ rằng tôi phải có trình tự và trình kích hoạt cùng một lúc trong DB nếu tôi không muốn gặp sự cố. Trình kích hoạt hỏi id của hàng cần chèn là null hay =0. Trong trường hợp này, chuỗi LOG_SEQ được gọi.
Vì vậy, nếu bạn cung cấp một giá trị cho @Id của thực thể của mình, nó có thể được chèn vào DB (nếu Id đó không tồn tại) và chuỗi sẽ không được gọi. Hãy thử xem mã của trình kích hoạt để biết chính xác điều gì xảy ra.