2010-12-13 15 views
19

persistence.xml trông như thế này:đường dẫn thích hợp để tham chiếu tệp jar trong tệp jpa persistence.xml trong ứng dụng web là gì?

<persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>jdbc/test</non-jta-data-source> 
    <jar-file>../../lib/app-services-1.0.jar</jar-file> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
</persistence-unit> 

Đây là một dự án web, do đó các đơn vị triển khai là một tập tin chiến tranh. Tệp jar tôi đã cố tham khảo nằm trong thư mục WEB-INF/lib/, persistence.xml nằm trong thư mục WEB-INF/classes/META-INF. Khi được triển khai, nó chỉ đơn giản cho tôi biết

"CẢNH BÁO: Không thể tìm thấy tệp (bỏ qua): tệp: .../../lib/app-services-1.0.jar".

Tôi cũng đã cố gắng mọi con đường có thể tôi có thể nghĩ ra, ví dụ: ../lib/app-services-1.0.jar, lib/app-dịch vụ-1.0.jar.

Đường dẫn phù hợp để làm điều này là gì?

+0

Bạn đang chạy ứng dụng trên máy chủ nào? JBoss? GlassFish? Nếu đó là JBoss, bạn không cần phải chỉ định Hibernate chút nào; đó là mặc định. –

+1

GlassFish, Matt. Vấn đề của tôi không phải là về Hibernate hay không, đó là về cách nói với nhà cung cấp JPA đường dẫn đến tệp jar để tự động quét các thực thể. – Bobo

Trả lời

12

chỉ trong trường hợp người khác tình cờ gặp phải điều này: báo cáo tệp jar chỉ hợp lệ. khi persistence-unit được triển khai như một phần của Enterprise Archives (.ear) - trong mọi trường hợp khác (.war), persistence.xml phải nằm trong/META-INF/và không thể định vị các lớp bên ngoài persistence-unit (xem: http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html). Vì vậy, theo như tôi biết, không có cách nào để có một persistence.xml sống trong WEB-INF/classes/META-INF tham chiếu đến các lớp không tồn tại trong các lớp WEB-INF /.

+1

Tôi nghĩ rằng giống như các tập tin tai, điều này là có thể cho các tập tin chiến tranh quá, nhưng sau khi cố gắng rất nhiều tôi thấy bài viết của bạn ở đây và hiểu rằng nó không phải là có thể cho các tập tin chiến tranh! nhưng điều thú vị là khi tôi chỉ định 'đường dẫn tuyệt đối' của tệp jar trong hệ thống tệp, nó hoạt động! ;) – Heidarzadeh

+2

Câu trả lời của bạn hoàn toàn không chính xác. Các lớp Entity không được mạnh bên trong tệp JAR có vai trò là gốc Persistence. Không có gì. Tôi biết thực tế rằng trong Weblogic, Glassfish và TomcatEE một tệp WAR hoàn toàn có thể chứa tệp JAR bên trong chứa tệp META-INF/persistence.xml và tham khảo khá nhỏ các tệp jar khác trong cùng thư mục lib bằng cách sử dụng jar -file yếu tố với tên của các lọ khác. Bạn cũng có thể thấy ở trang 367 và 368 của JPA 2.1 JSR rằng đây là trường hợp. Với điều đó nói rằng, làm cho công việc này trong Wildfly 10 là prooving là một thách thức. – 99Sono

+0

Tải xuống JSR từ đây: http://download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/index.html – 99Sono

0

Không chắc chắn điều này liên quan đến việc bạn đang triển khai dưới dạng WAR, nhưng đường dẫn phải đơn giản là "app-sevices-1.0.jar" và bình phải nằm trong lib của ứng dụng Java EE. Vấn đề là: Tôi không chắc liệu điều này có sẵn cho ứng dụng Java EE "chiến tranh" đơn giản hóa hay không. Tôi nghi ngờ điều này chỉ có sẵn cho tệp triển khai Java EE truyền thống (tai). Tôi sẽ thử nghiệm tạo ra một EAR, chứa một WAR cho webapp, JAR cho PU và các JAR khác của bạn cho các dịch vụ ứng dụng, giống như một triển khai Java EE truyền thống.

Một điều cần lưu ý là đường dẫn tương đối không được hỗ trợ và việc sử dụng điều này trong môi trường SE không được tất cả các nhà cung cấp hỗ trợ.

+0

Đã thử đường dẫn "ứng dụng-dịch vụ-1.0.jar" đơn giản và như bạn nghi ngờ, nó không hoạt động. Vì vậy, tôi đoán câu hỏi là cho các tập tin chiến tranh, rằng chỉ có thể không được sử dụng? – Bobo

15

Xem qua jsr luôn hoạt động!

8.2.1.6.3 Tệp Jar

Một hoặc nhiều tập tin JAR có thể được xác định bằng cách sử dụng các yếu tố jar-file thay vì, hoặc bổ sung cho các tập tin bản đồ theo quy định tại các mapping-file yếu tố. Nếu được chỉ định, các tệp JAR này sẽ được tìm kiếm trong các lớp kiên trì được quản lý và mọi chú thích siêu dữ liệu ánh xạ được tìm thấy trên chúng sẽ được tạo sẵn, hoặc chúng sẽ được ánh xạ bằng cách sử dụng mặc định chú thích ánh xạ được xác định bởi đặc tả này. Các tệp JAR như vậy được chỉ định liên quan đến thư mục hoặc tệp jar chứa gốc của đơn vị persis-tence.

Ví dụ sau minh họa việc sử dụng phần tử jar-file để tham chiếu các lớp kiên trì bổ sung. Các ví dụ này sử dụng quy ước rằng tệp jar có tên chấm dứt trong “PUnit” chứa tệp persistence.xml và tệp jar có tên chấm dứt trong “Đối tượng” chứa các lớp kiên trì bổ sung.

Example 1: 
app.ear 
    lib/earEntities.jar 
    earRootPUnit.jar (with META-INF/persistence.xml) 
persistence.xml contains: 
    <jar-file>lib/earEntities.jar</jar-file> 

Example 2: 
app.ear 
    lib/earEntities.jar 
    lib/earLibPUnit.jar (with META-INF/persistence.xml) 
persistence.xml contains: 
    <jar-file>earEntities.jar</jar-file> 

Example 3: 
app.ear 
    lib/earEntities.jar 
    ejbjar.jar (with META-INF/persistence.xml) 
persistence.xml contains: 
    <jar-file>lib/earEntities.jar</jar-file> 

Example 4: 
app.ear 
    war1.war 
     WEB-INF/lib/warEntities.jar 
     WEB-INF/lib/warPUnit.jar (with META-INF/persistence.xml) 
persistence.xml contains: 
    <jar-file>warEntities.jar</jar-file> 

Example 5: 
app.ear 
    war2.war 
     WEB-INF/lib/warEntities.jar 
     WEB-INF/classes/META-INF/persistence.xml 
persistence.xml contains: 
    <jar-file>lib/warEntities.jar</jar-file> 

Example 6: 
app.ear 
    lib/earEntities.jar 
    war2.war 
    WEB-INF/classes/META-INF/persistence.xml 
persistence.xml contains: 
    <jar-file>../../lib/earEntities.jar</jar-file> 

Example 7: 
app.ear 
    lib/earEntities.jar 
    war1.war 
    WEB-INF/lib/warPUnit.jar (with META-INF/persistence.xml) 
persistence.xml contains: 
    <jar-file>../../../lib/earEntities.jar</jar-file> 

Như bạn thấy không có ví dụ cho các tập tin chiến tranh, chiến tranh tất cả các file trong các ví dụ ở trên là file tai bên trong!
Nhưng tôi đã thử nghiệm trong các tệp chiến tranh và nó hoạt động ngay khi tôi chỉ định đường dẫn tuyệt đối của tệp jar và nó không phải là một cách tiếp cận tốt cho môi trường sản xuất!

+0

Đây là câu trả lời hay nhất vì nó đưa ra các ví dụ về những gì cần đưa vào phần tử tệp jar. Xác minh nó để làm việc là tốt. –

+0

@Heidarzadeh làm thế nào bây giờ một tiêm một EntityManager tham chiếu tên đơn vị tồn tại bên trong earLibPUnit.jar, không có ví dụ nào cho thấy – Francis

7
war2.war 
     WEB-INF/lib/warEntities.jar 
     WEB-INF/classes/META-INF/persistence.xml 
persistence.xml contains: 
    <jar-file>lib/warEntities.jar</jar-file> 

định dạng này hoạt động cho tệp chiến tranh. Im sử dụng Wildlfy 8.2.0 và JPA 2.1

+1

cũng hoạt động với Payara Server 4.1.1.162 #badassfish (build 116) –

+0

hoạt động trên websphere 8.5.5 – Martin