2010-10-01 34 views
7

Tôi đang cố gắng sử dụng Hibernate 3.5.5 với mùa xuân HibernateJpaVendorAdapter trên Glassfish V2 nhưng tôi nhận được ngoại lệ sau khi bối cảnh mùa xuân được khởi tạo:Nâng cấp Glassfish v2 lên JPA 2.0?

java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getSharedCacheMode()Ljavax/persistence/SharedCacheMode; 

tại org.hibernate.ejb.util.LogHelper .logPersistenceUnitInfo (LogHelper.java:39) tại org.hibernate.ejb.Ejb3Configuration.configure (Ejb3Configuration.java:517) tại org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory (HibernatePersistence.java:73)

Các vấn đề là Glassfish V2 sử dụng JPA1.0 được tải trên classpath máy chủ trước khi hibernate-jpa -2.0-api-1.0.0.Final.jar được giao với Hibernate. JPA 1.0 không có phương thức getSharedCacheModel trong PersistenceUnitInfo nhưng JPA 2.0 thực hiện.

Có cách nào nâng cấp Glassfish V2 để sử dụng JPA 2.0 (hoặc bất kỳ giải pháp nào khác cho vấn đề này) không?

Chúc mừng,

J

+0

Would nâng cấp lên GlassFish 3 là một lựa chọn? –

Trả lời

4

Bạn có thể thử đặt 2.0 jar JPA trong /domain/lib/endorsed dir

+0

Chà, tôi phải thừa nhận tôi rất ngạc nhiên. Tôi thậm chí không hiểu làm thế nào điều này có thể làm việc (tôi có nghĩa là, mà không phá vỡ JPA container quản lý). –

+0

Pascal Thivent tốt, tôi _think_ lọ đặt có được ưa thích thay vì libs container. Không phải là tôi đã thực sự sử dụng nó (Glassfish đã qua sử dụng cách đây 2 năm), nhưng tôi nghĩ tôi có thể gợi ý nó. :) – Bozho

+1

Điều này không hiệu quả đối với tôi. Ý của bạn là: $ GLASSFISH_HOME/domains/domain1/lib/endorsed hoặc $ GLASSFISH_HOME/lib/endorsed? Cảm ơn. –

0

Theo hiểu biết của tôi, nó không thể nâng cấp Java EE 5 container lõi thư viện JPA bằng cách đơn giản thay thế các thư viện và sử dụng một thùng chứa được quản lý JPA 2.0 EntityManager.

Tuy nhiên, có thể sử dụng triển khai JPA 2.0 với thư viện API JPA 2.0 được cung cấp ở cấp ứng dụng và sử dụng ứng dụng được quản lý JPA 2.0 EntityManager.

Để thử cách tiếp cận thứ hai với GlassFish v2, bạn sẽ cần phải tắt ủy nhiệm lớp học (để các thư viện ứng dụng sẽ được sử dụng trước). Điều này có thể được cấu hình trong một sun-web.xml rằng bạn sẽ được đóng gói dưới WEB-INF:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-web-app 
     PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.1 Servlet 2.4//EN" 
     "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-1.dtd"> 
<sun-web-app error-url=""> 
    <class-loader delegate="false"/> 
</sun-web-app> 
+0

hm, ai đó đã downvoted này .. ở đây có một sự điều chỉnh. – Bozho

+1

Điều này sẽ không hoạt động đối với trường hợp này, theo tài liệu Glassfish: "Đối với một số gói, bao gồm java. * Và javax. *, Độ phân giải biểu tượng luôn được ủy quyền cho bộ nạp lớp cha mẹ bất kể cài đặt đại biểu. ghi đè các lớp thời gian chạy Java lõi hoặc thay đổi các phiên bản API của các đặc tả là một phần của nền tảng Java EE. " –

1

Thanks for the guys phản hồi. Đặt bình jpa vào/domain/lib/endorsed đã làm việc cho tôi.

Setting ...

<sun-web-app error-url=""> 
    <class-loader delegate="false"/> 
</sun-web-app> 

... không làm việc cho tôi mặc dù đó chỉ có thể là do các lớp học là một phần của javax.

Tôi cũng đã thử loại bỏ JPATemplate của Spring và sử dụng trực tiếp JPA @PersistenceContext EntityManager - điều này đã gây ra tất cả các vấn đề. Glassfish v2 + Spring + Hibernate không phải là bạn!

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