Với một loại @GeneratedValue id bạn không thể biết rằng giá trị trước (trước khi thực sự viết nó). Tuy nhiên một khi bạn vẫn còn Bean của bạn, trường id sẽ được cư trú trong trường hợp bean đó và bạn có thể lấy nó mà không cần phải làm một truy vấn bổ sung cho nó. Nói cách khác:
MyEntiry myEnt = new MyEntity(); //the id field is null now
entityManager.persist(myEnt);//the id field is populated in myEnt now
Long id = myEnt.getId();
Ngoài ra, tùy thuộc vào cách EntityManager
bạn được cấu hình, bạn có thể cần phải cũng cam kết đầu tiên giao dịch (bằng tay) trước khi bạn có thể nhận được id đó.
Cập nhật theo bình luận
Nếu bạn muốn chặn và làm điều gì đó để các thực thể trước khi nó được lưu lại và/hoặc cập nhật, bạn có thể sử dụng JPA Listeners Vòng đời (nếu bạn đang sử dụng JPA phiên bản 2): Handling JPA lifecycle event using listeners and callbacks .
Về cơ bản, bạn có thể tạo ra một phương pháp validate()
trong đậu của bạn, chú thích nó với @PrePersist
và @PreUpdate
và thực hiện xác nhận trong nó (nếu đang trống bộ nó với giá trị id của)
Cập nhật mỗi comment 2
Có, tôi thành thật chỉ nghĩ về điều đó ngay bây giờ: nếu id được tạo tự động, nó có thể được điền sau khi sự kiện đã tồn tại trước đó, chẳng hạn như khi mã tiền tồn tại của bạn được thực thi bạn vẫn không biết id là gì (bạn cũng có thể thấy rằng trong ví dụ bạn liên kết tới id là NOT autogenerated nhưng được đặt thủ công). Những gì bạn có thể làm trong trường hợp này là thêm trường boolean vào thực thể của bạn (chú thích với @Transient
để nó không bị kéo dài) được gọi là isCodeEmpty
(mặc định là sai nếu không được khởi tạo cụ thể). Sau đó, trong phương thức chú thích @PrePersist
của bạn, bạn kiểm tra xem giá trị của trường mã có trống không và nếu có, hãy đặt giá trị boolean thành true. Sau đó, bạn Refactor phương pháp setId(...)
bạn như vậy mà (ngoài đặt trường id) nó sẽ kiểm tra boolean này, và nếu thiết lập đúng giá trị của trường mã như của các trường id:
public class YourEntity {
@Transient
private boolean isCodeEmpty;
public void setId(Whatever id) {
this.id = id;
if(isCodeEmpty) {
this.code = id;
//if necessary:
//this.isCodeEmpty = false;
}
}
@PrePersist
public void validate() {
if(code == null || code.isEmpty()) {
isCodeEmpty = true;
}
}
}
Nguồn
2012-10-05 09:02:09
Bạn có thể tránh được @GeneratedValue, sử dụng máy phát điện cho mình để có được những giá trị và đặt nó là thực thể "bằng tay" – SJuan76
Tôi không muốn đặt nó vào thực thể manual.if tôi nhận được giá trị tiếp theo cho id từ oracle và tôi đặt nó vào id của thực thể mới, là nó hợp lý? – mstzn