Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để biết id trước khi lưu một đối tượng trong jpa

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@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;
 }

}


}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách gọi thủ tục có tham số ra làm kiểu bảng từ một lớp Java

  2. Làm thế nào để chuyển đổi số thành chuỗi trong Oracle?

  3. Oracle:Số ngày giữa hai ngày và Loại trừ các ngày trong tuần cách xử lý số âm

  4. Kiểm tra xem hai lựa chọn có tương đương nhau không

  5. Dữ liệu truy vấn từ XML