2013-07-30 18 views
11

Tôi muốn tận dụng các chú thích JPA @Entity để không khai báo các thực thể lớp một tệp persistence.xml J2SE. Những gì tôi muốn tránh:Có cách nào để quét các thực thể JPA không khai báo các lớp liên tục trong một tệp persistence.xml không?

<persistence-unit name="test" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.mycompany.entities.Class1</class> 
    <class>com.mycompany.entities.Class2</class> 
    <class>com.mycompany.entities.Class3</class> 
</persistence-unit> 

và đây là những gì persistence.xml thực tế của tôi trông giống nhau

<persistence-unit name="test" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <!-- Scan for annotated classes and Hibernate mapping XML files --> 
     <property name="hibernate.archive.autodetection" value="class, hbm" /> 
     <property name="hibernate.cache.use_second_level_cache" value="false" /> 
     <property name="hibernate.cache.use_query_cache" value="false" /> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
    </properties> 
</persistence-unit> 

Có một cách tiêu chuẩn để quét các đối tượng JPA trong một tập tin persistence.xml từ bên trong một mô-đun JAR? Có cách nào không chuẩn Hibernate để quét các thực thể JPA trong một tệp persistence.xml từ bên trong một mô-đun JAR không?

Trả lời

14

-Hãy chắc chắn rằng các thực thể của bạn và persistence.xml sẽ kết thúc trong cùng một classpath khi bạn tạo jar của bạn.

Không thể quét các đối tượng nếu chúng đang ngồi trong một đường dẫn lớp khác. Nếu bạn cần có chúng ngồi trong các classpath khác nhau, một trong những mẹo tôi đã nhìn thấy để làm cho nó hoạt động: No autodetection of JPA Entities in maven-verify.

Nếu bạn không chắc chắn nơi mọi thứ đang kết thúc, bạn có thể giải nén tệp .jar và cao điểm. Đây là một dự án bền bỉ web giải nén:

Unpacked Web Persistence JAR

Thông báo lớp học của tôi là xuống thư mục com, và persistence.xml của tôi là trong thư mục META-INF. Cả hai đều thuộc cùng một classpath class, do đó autoscan sẽ hoạt động.

-Đặt thuộc tính hibernate.archive.autodetection.

<!-- Scan for annotated classes and Hibernate mapping XML files --> 
<property name="hibernate.archive.autodetection" value="class, hbm" /> 

-Thêm sai đến sự tồn tại đơn vị

<persistence-unit name=...> 
<exclude-unlisted-classes>false</exclude-unlisted-classes> 
    ... 

Hy vọng rằng một trong những sẽ làm việc cho bạn.

+0

Có vẻ như vậy, nhưng nó không hoạt động trong trường hợp của tôi. \t Đây là định nghĩa của thuộc tính hibernate.archive.autodetection: "Xác định phần tử nào được tự động phát hiện bởi Trình quản lý thực thể Hibernate trong khi phân tích cú pháp tệp .par. (Mặc định là lớp, hbm).". Nhưng một kho lưu trữ .par là gì? Tôi đã không bao giờ nghe nói về một arhive như vậy. – 1tox

+0

NB: Tôi đã cập nhật bài đăng gốc – 1tox

+0

Lưu trữ .par là tệp lưu trữ liên tục nơi các thực thể của bạn và persistence.xml có thể được nhóm lại. Nó không cần thiết, do đó, đừng lo lắng về nó (xem bài viết cuối cùng từ một thành viên trong nhóm Hibernate ở đây: https://forum.hibernate.org/viewtopic.php?f=9&t=947671). Một gợi ý khác là thêm: false vào đơn vị kiên trì của bạn. – Cody