2010-07-25 33 views
13

Đối với mỗi @Entity Tôi cần phải thực hiện như sau:Làm cách nào để lấy khóa chính của bất kỳ thực thể JPA nào?

public <Entity> boolean insert(final Entity entity){ 
    if (em.find(entity.getClass(), entity.getId()) == null) { 
     et.begin(); 
     em.persist(entity); 
     et.commit(); 
     return true; 
    } 
    return false; 
} 

Đó là kiên trì thực thể nếu nó không tồn tại, và biết nếu nó đã làm hay không hiện hữu. Với thực thể, tôi đang cố gắng tiếp cận @Entity, mặc dù tôi nhận ra đó không phải là mối quan hệ thừa kế. Tôi có thể sử dụng loại nào để chỉ mọi thực thể JPA? Tôi chỉ có thể tạo ra một giao diện/lớp trừu tượng MyEntities và có tất cả chúng kế thừa, nhưng đó là cách? Tôi hy vọng sẽ có ít mã hơn. Ngoài ra, tôi mong đợi để có thể trích xuất khóa chính của mọi thực thể, như tôi cố gắng trong .getId().

Trả lời

36

Chức năng này đã được thêm vào JPA 2.0. Đơn giản chỉ cần gọi:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity); 
+0

ném ngoại lệ con trỏ null –

4

Cách tiếp cận giao diện chung là những gì tôi sử dụng và nó hoạt động tốt. Sử dụng JPA thuần túy tôi không thấy cách nhận dạng.

Hãy xem merge(). Tôi đã không được sử dụng nó nhiều bản thân mình nhưng tôi nghĩ

Hibernate có cách để làm điều này

Serializable id = session.getIdentifier(entity); 

Nhưng đây không phải là tiêu chuẩn JPA.

4

Đọc một bài viết về Generic Dao approach.

Tôi không hiểu rõ vấn đề của bạn, nhưng nếu bạn muốn lấy id tổ chức - chỉ cần tải xuống. có sẵn sau khi kiên trì phương pháp của nó là hoàn toàn ví dụ:

em.persist(entity); 
et.commit(); 
int id = entity.getId() 

Tôi thường làm cho một lớp AbstractEntity với lĩnh vực id và bộ truy xuất và kế thừa toàn bộ các đơn vị khác của tôi từ lớp này.

Vấn đề duy nhất với cách tiếp cận này là nếu bạn cần phải thực hiện bất kỳ thực thể nào của mình có thể tuần tự, bạn sẽ phải thực hiện AbstractEntity có thể tuần tự hóa được. Nếu không, trường id sẽ không được tuần tự hóa trong thực thể cần được tuần tự hóa.

1

Một cách khác để lấy thực thể ID:

Session session = entityManager.unwrap(Session.class); 
Object entityId = session.getId(entity); 

Cách tiếp cận này sử dụng extractPrimaryKeyFromObject() phương pháp từ ObjectBuilder lớp.

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