2010-02-26 21 views
24

Có thể xác định tên bảng gốc của một thực thể không?Làm thế nào để lấy tên bảng ánh xạ cho một thực thể trong JPA khi chạy?

Nếu một chú thích Table hiện diện thật dễ dàng:

entityClass.getAnnotation(Table.class).name() 

Nhưng những gì về nếu không có Table chú thích là hiện nay?

Hibernate cung cấp thông tin này thông qua các lớp Configuration:

configuration.getClassMapping(entityClass.getSimpleName()).getTable().getName() 

Có một cái gì đó tương tự trong JPA?

+1

theo tôi biết đây thực sự không phải là một phần của API chuẩn, vì vậy bạn sẽ phải dựa vào việc triển khai thực tế (hibernate, toplink, ...) để có được những gì bạn muốn –

Trả lời

3

Nếu không có chú thích bảng (và không có ORM.xml) thì trong JPA tên bảng được hình thành dựa trên tên lớp (xem thông số JPA). Do đó tại sao chính xác bạn cần một phương pháp accessor?

Xem http://www.datanucleus.org/products/accessplatform_2_0/jpa/orm/datastore_identifiers.html

+1

Tôi muốn tránh thực hiện thuật toán lần nữa. Và tôi cũng muốn tránh phân tích cú pháp tệp ánh xạ XML. Nhưng tôi đã nghĩ, sẽ không có cách nào để yêu cầu thực hiện JPA cho các tên bảng thực. Cảm ơn rất nhiều. – marabol

+0

Bạn có thể ghi đè tên bằng cách sử dụng tệp orm.xml để lập trình lại thuật toán cũng cần phải đọc trong tệp orm đúng. –

+1

Liên kết đã chết ... –

1

Nếu bạn sử dụng chú thích @Table, không có vấn đề gì, như bạn đã hiển thị. Nếu bạn không sử dụng chú thích đó thì tên bảng giống với tên lớp (mặc định JPA).

Điều thú vị bắt đầu nếu bạn sử dụng tệp ánh xạ, bạn cần phải phân tích cú pháp và truy xuất tên bảng - điều này không quá khó, nhưng yêu cầu một số công việc. Nếu bạn sợ các vấn đề hiệu suất thì bạn có thể phân tích cú pháp các tệp ánh xạ một lần và lưu trữ tất cả các tên bảng.

11

Đây là phương pháp tôi đang sử dụng với EclipseLink (không có tập tin bản đồ):

/** 
* Returns the table name for a given entity type in the {@link EntityManager}. 
* @param em 
* @param entityClass 
* @return 
*/ 
public static <T> String getTableName(EntityManager em, Class<T> entityClass) { 
    /* 
    * Check if the specified class is present in the metamodel. 
    * Throws IllegalArgumentException if not. 
    */ 
    Metamodel meta = em.getMetamodel(); 
    EntityType<T> entityType = meta.entity(entityClass); 

    //Check whether @Table annotation is present on the class. 
    Table t = entityClass.getAnnotation(Table.class); 

    String tableName = (t == null) 
         ? entityType.getName().toUpperCase() 
         : t.name(); 
    return tableName; 
} 
+0

Đừng nghĩ rằng đó là một cách chính xác, ví dụ: phương thức nào sẽ trả về cho thực thể có tên SomeComplexName? – skwisgaar

+0

@skwisgaar 'SOMECOMPLEXNAME' trong trường hợp không có chú thích' @ Table' trên thực thể. Nếu không, 'name' được chỉ định thông qua chú thích' @ Table'. –

+0

Hành vi mặc định afaik là ánh xạ các thực thể được gắn liền với các bảng được đánh dấu (ví dụ: SomeComplexName -> some_complex_name). Tôi có thể đã sai mặc dù :) – skwisgaar

0

Yêu cầu để meta mô hình của ORM underlaying là đáng tin cậy nhất: nhìn vào sự hiện diện của @Table là không đủ, không chỉ nó có thể bị ghi đè bởi cấu hình XML (ví dụ orm.xml) nhưng với chiến lược JOINED, @Table có thể nằm trong một siêu lớp.

+0

Đây là một nhận xét. – jogo

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