2012-03-10 32 views
27

Tôi đang tìm kiếm một cách thông minh và dễ đọc để lấy id của một thực thể tồn tại sử dụng JPA. Id là Integer.Cách nhận Mã số của thực thể tồn tại lâu nhất bằng cách sử dụng JPA

Người ta có thể nghĩ đến các giải pháp sau:

  1. Nếu không sử dụng GeneratedValue chiến lược. Điều này đòi hỏi tìm kiếm một id miễn phí trước khi kiên trì, sau đó đặt nó vào thực thể để được tiếp tục: cồng kềnh, nhưng hoạt động.
  2. Với chiến lược GeneratedValue. Các nhà cung cấp kiên trì sẽ chăm sóc thế hệ id. Điều này có vẻ thông minh hơn, nhưng làm thế nào để có được id?

Xem dưới đây để biết giải pháp 2

MyEntity en = new MyEntity(); 
en.setName("My name"); 
em.persist(en); 
System.out.println(en.getId()); 

này in một id rỗng!

Mọi đề xuất? Tôi đang sử dụng MySql, EclipseLink, nhưng cần một giải pháp di động.

Trả lời

53

liên tục không đảm bảo tạo ID. ID được đảm bảo chỉ được tạo vào thời gian xả. Vì vậy, nếu bạn thực sự cần ID trước khi giao dịch kết thúc (và trình quản lý thực thể được flushed), hãy gọi flush() để nhận ID:

MyEntity en = new MyEntity(); 
en.setName("My name"); 
em.persist(en); 
em.flush(); 
System.out.println(en.getId()); 
+0

@JB Nizet, làm cách nào tôi có thể nhận id trước 'persist () 'phương pháp? Tôi mong chờ nó vì tôi muốn thay đổi định dạng id tùy chỉnh? – CycDemo

+1

@CycDemo: bạn không thể, trừ khi bạn tự tạo nó. –

+0

@JBNizet Nguồn gốc của câu lệnh "tồn tại ở đâu không được đảm bảo để tạo ID"? Trong JPS Spec (JSR), tôi đọc hai câu lệnh sau (Chương 3.2): - Ví dụ thực thể được quản lý là một cá thể có bản sắc dai dẳng - Các ngữ nghĩa của hoạt động tồn tại được áp dụng cho thực thể X như sau: X là một thực thể mới, nó trở nên được quản lý. ... * Nếu tôi diễn giải từng từ một, tôi sẽ nói rằng spec yêu cầu rằng Id được đặt sau khi gọi persist() *. Đó cũng là hành vi của Hibernate. – jbandi

Các vấn đề liên quan