@GeneratedValue(strategy=GenerationType.TABLE)
yêu cầu nhà cung cấp JPA sử dụng bảng để lấy ID từ khi chèn thực thể mới được tạo vào cơ sở dữ liệu.
Khi sử dụng Hibernate làm nhà cung cấp, điều này sẽ dẫn đến một bảng hibernate_sequences
có hai cột: tên thực thể và danh tính tối đa đã được gán cho thực thể này. Ở đây, có vẻ như Hibernate không thành công để có được ID tiếp theo từ nó cho thực thể của bạn nhưng thật khó để nói chính xác lý do tại sao bởi vì bạn đã không cung cấp đủ thông tin cho điều đó.
Vì vậy, bạn có thể vui lòng cung cấp toàn bộ stacktrace không? Ngoài ra, vui lòng bật tính năng ghi nhật ký với thuộc tính hibernate.show_sql
được đặt thành true
và đặt mức nhật ký thích hợp log4j.logger.org.hibernate.SQL=DEBUG
. Tham gia nhật ký cho câu hỏi của bạn nếu có thể.
Có thể chỉ cần kiểm tra xem bạn đã định cấu hình đúng hibernate.dialect
cho Oracle chưa. Trên thực tế, hãy tham gia cấu hình ngủ đông của bạn nếu có thể.
PS: Cách "truyền thống" để tạo PK với Oracle là sử dụng chuỗi (bạn có thể để Hibernate đoán chiến lược tốt nhất cho loại cơ sở dữ liệu của bạn bằng cách sử dụng GenerationType.AUTO
hoặc ép nó bằng cách sử dụng SEQUENCE
) nhưng tôi cho rằng bạn muốn kết quả cấu trúc dữ liệu là cơ sở dữ liệu bất khả tri. Nếu không, tôi đề nghị đi cho chuỗi thay thế.
EDIT: Trả lời nhận xét từ OP về GenerationType.AUTO
. Thật vậy, mặc định là một chuỗi toàn cầu duy nhất được gọi là hibernate_sequence
và điều này có thể là một vấn đề. Nhưng, với các thiết lập hiển thị dưới đây, bạn có thể sử dụng GenerationType.AUTO
và vẫn kiểm soát tên của dãy cho các trường hợp cơ sở dữ liệu sử dụng các trình tự:
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private long id;
Nói cách khác, bạn có thể sử dụng sử dụng một tên chuỗi khác nhau cho mỗi bảng mà không mất tính di động.
Nguồn
2009-11-30 03:49:43
nếu tôi đặt GenerationType.Auto, nó sẽ sử dụng số gia tăng toàn cầu, có nghĩa là tất cả các thực thể của tôi sẽ tăng cùng một số. Các mã chạy tốt, nhưng nó sẽ chạy ra khỏi số gia tăng? – cometta
@Pascal: Nếu chúng tôi đang cung cấp Trình tạo chuỗi, nó có giúp xác định startegy là AUTO không? – Nrj
@Nrj Trên thực tế, nếu bạn sử dụng 'AUTO' và nếu cơ sở dữ liệu sử dụng chuỗi,' @ SequenceGenerator' sẽ giúp kiểm soát tên của chuỗi. Nhưng nó sẽ bị "bỏ qua" nếu cơ sở dữ liệu không (ví dụ với HSQLDB). Vì vậy, không giống như 'SEQUENCE', điều này vẫn còn cầm tay. –