Với id loại @GeneratedValue, bạn không thể biết trước giá trị đó (trước khi thực sự viết nó). Tuy nhiên, một khi bạn duy trì Bean của mình, trường id sẽ được điền trong phiên bản bean đó và bạn có thể lấy nó mà không cần thực hiện thêm truy vấn 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
của bạn được định cấu hình, bạn cũng có thể cần phải cam kết giao dịch trước (theo cách thủ công) trước khi bạn có thể nhận được id đó.
Cập nhật theo nhận xét
Nếu bạn muốn chặn và thực hiện điều gì đó với thực thể trước khi nó được lưu và / hoặc cập nhật, bạn có thể sử dụng JPA LifeCycle Listilities (nếu bạn đang sử dụng JPA phiên bản 2):Xử lý sự kiện vòng đời JPA bằng cách sử dụng trình nghe và gọi lại.
Về cơ bản, bạn có thể tạo validate()
trong bean của bạn, chú thích nó bằng @PrePersist
và @PreUpdate
và thực hiện xác thực trong đó (nếu mã trống, hãy đặt nó thành giá trị của id)
Cập nhật mỗi nhận xét thứ 2
Vâng, thành thật mà nói, tôi vừa mới nghĩ đến điều đó:rằng nếu id được tạo tự động, nó có thể được điền SAU sự kiện tồn tại trước, như vậy khi mã lưu trữ trước 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ể nhận thấy rằng trong ví dụ, bạn liên kết đến id KHÔNG được tạo tự động mà được đặt theo cách thủ công). Điều 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 bằng @Transient
vì vậy nó sẽ không tiếp tục tồn tại) được gọi là isCodeEmpty
(sai theo mặc định nếu không được khởi tạo cụ thể). Sau đó, trong @PrePersist
của bạn phương pháp chú thích bạn kiểm tra xem giá trị cho trường mã có trống không và nếu có, hãy đặt boolean thành true. Sau đó, bạn cấu trúc lại setId(...)
của mình phương thức sao cho (ngoài việc đặt trường id) nó sẽ kiểm tra boolean này và nếu đúng, hãy đặt giá trị của trường mã thành giá trị của 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;
}
}
}