2010-07-06 17 views
10

Tôi đang cố nâng cấp lên Hibernate 3.5.3-FINAL.Hibernate 3.5.x: NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval

Khi chạy thử nghiệm đơn vị của tôi, bây giờ tôi nhận được ngoại lệ sau đây:

java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z 
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1837) 

classpath của tôi chứa JAR sau của:

Từ quận Hibernate:

antlr-2.7.6.jar 
commons-collections-3.1.jar 
dom4j-1.6.1.jar 
javassist-3.9.0.GA.jar 
jta-1.1.jar 
slf4j-api-1.5.8.jar 

cglib-2.2.jar 
hibernate-jpa-2.0-api-1.0.0.Final.jar 
hibernate3.jar 

Các lọ khác:

blazeds-common-3.2.0.3978.jar 
blazeds-core-3.2.0.3978.jar 
blazeds-opt-3.2.0.3978.jar 
blazeds-proxy-3.2.0.3978.jar 
blazeds-remoting-3.2.0.3978.jar 
commons-lang-2.3.jar 
dbunit-2.4.7.jar 
ejb3-persistence.jar // Note, I've tried excluding this, but I get different errors 
guava-r05.jar 
hsqldb-1.8.0.7.jar 
junit-4.1.jar 
lambdaj-2.0-with-dependencies.jar 
log4j-1.2.14.jar 
mockito-all-1.8.0.jar 
persistence-api-1.0.jar 
spring-security-core-2.0.0.jar 
spring.jar 
sqljdbc.jar 

Tôi đã nghiên cứu này, và tôi find answers đó nêu webserver tôi phải JPA2 Compliant:

Unfortunately if your app server is not JPA 2 compliant, you are likely to be out of luck

Dự án này là một thư viện, không phải là một dự án máy chủ web. (Mặc dù nó cuối cùng được triển khai cho một máy chủ web, tôi chỉ đơn giản là chạy thử nghiệm đơn vị ở đây)

Tôi đang thiếu gì?

<indulgent_rant>

Là một sidenote, nó rất bực bội mà mỗi khi tôi nâng cấp Hibernate, tôi thấy mình chi tiêu giờ nghiên cứu lọ mâu thuẫn cho MethodNotFoundException hoặc ClassNotFoundException 's. Phải có một cách đơn giản hơn?

Tôi nghĩ chắc chắn rằng với thông báo họ đã hợp nhất các mô-đun trở lại một dự án cốt lõi, những xung đột đó sẽ biến mất?

</indulgent_rant>

Trả lời

18

Như được chỉ ra bởi Timo, hãy xóa persistence-api-1.0.jar.

Chỉ trong trường hợp, đây là sự phụ thuộc Tôi đang sử dụng:

 
org.hibernate:hibernate-entitymanager:jar:3.5.3-Final:compile 
+- org.hibernate:hibernate-core:jar:3.5.3-Final:compile 
| +- antlr:antlr:jar:2.7.6:compile 
| +- commons-collections:commons-collections:jar:3.2:compile 
| +- dom4j:dom4j:jar:1.6.1:compile 
| | \- xml-apis:xml-apis:jar:1.0.b2:compile 
| \- javax.transaction:jta:jar:1.1:compile 
+- org.hibernate:hibernate-annotations:jar:3.5.3-Final:compile 
| \- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile 
+- cglib:cglib:jar:2.2:compile 
| \- asm:asm:jar:3.1:compile 
+- javassist:javassist:jar:3.9.0.GA:compile 
\- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile 

Tôi nhận được chúng từ khai đơn này trong tôi pom.xml:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>3.5.3-Final</version> 
</dependency> 

này nên bằng cách nào đó trả lời của bạn nuông chiều rant (nếu tôi rephrase: sử dụng Maven - hoặc biết những gì bạn đang làm).

+0

Không phải là sự hiện diện của cả xung đột 3.5.3 và hibernate-jpa-2.0-api hibernate-jpa-2.0-api, vì cả hai đều chứa lớp OneToMany? – acalypso

+2

Chúng không xung đột, vì chúng có các không gian tên khác nhau. Có javax.persistence.OneToMany và một là org.hibernate.mapping.OneToMany. –

+0

Tôi không biết điều gì ... nhưng làm việc xD! – wrivas

2

Hãy thử thay thế bền bỉ-api-1.0.jar với 2.0 jar JPA.

9

Di chuyển những tập tin từ dự án vị trí lib bền bỉ-api-1.0.jar EJB3-persistence.jar

thêm chỉ javax.persistence-2.0.0.jar

nó chứa tất cả các yêu cầu lĩnh vực và atrributes.

hãy thử cách này nó sẽ hoạt động cho vấn đề của bạn.

Manish Jaiswal

+0

Plus Một cho điều này, bạn phải loại trừ 'ejb3-persistence.jar' là tốt nếu bạn nhận được lỗi này. –

1

thêm javax.persistence-2.0.0.jar nên làm việc tốt ...

2

phát hiện một sửa chữa cho vấn đề này ít nhất là với những gì tôi đang làm việc với: IBM WebSphere 7 và MyEclipse Blue (Spring), hoặc Bling, ver. 10.6. Tôi đã tạo một ứng dụng có phụ thuộc vào các dự án khác, một trong số đó sử dụng Hibernate 3.6.3, yêu cầu JPA 2.0. IBM WS tải JPA 1.0 để hỗ trợ chính nó trước JPA 2.0 và giải quyết tất cả các tham chiếu đến JPA đến ver. 1.0. Trong trường hợp của IBM WS, điều này gây ra lỗi được báo cáo ở trên. Việc sửa chữa duy nhất mà tôi đã đi qua kể từ bây giờ bao gồm thêm JPA 2.0 như một thư viện chia sẻ, sau đó thiết lập các máy chủ để tải thư viện đó trước lớp có nguồn gốc của nó, tương tự như phương pháp thảo luận ở đây:

http://www.mkyong.com/websphere/websphere-7-javaxpersistenceonetomany-orphanremoval-error/

Nhưng chúng tôi quản trị viên máy chủ sẽ không cho phép thay đổi chính sách trình nạp lớp máy chủ. Vì vậy, tôi vẫn cần phải tìm cách để có được dự án của tôi để sử dụng JPA 2.0 chứ không phải 1.0. Tôi đã thử rất nhiều thứ nhưng cuối cùng đã đi cho một Hail Mary và nó đã làm việc.

Khắc phục là thêm tệp JJ 2.0 .jar vào dự án .war và .ear của bạn rồi chỉnh sửa đường Class-Path trong tệp kê khai trong cả dự án .war và .ear của bạn để trỏ tới .jar các tập tin. Có vẻ như họ phải ở trong cả hai hoặc cách tiếp cận sẽ không hoạt động, vì vậy JPA 2.0 .jar phải ở cả hai .war và .ear.

Trong ứng dụng của bạn (dự án .war), thêm hibernate-jpa-2.0-api-1.0.0.Final.jar vào thư mục gốc của dự án. MyEclipse Blue sẽ hiển thị nó dưới dạng một tệp tại vị trí đó và cũng được liệt kê trong "Thư viện tham chiếu" trong khung nhìn Package Explorer. Sau đó mở file manifest tại /WebRoot/META-INF/MANIFEST.MF và chắc chắn rằng dòng Class-Đường dẫn đọc:

Class-Path: /hibernate-jpa-2.0-api-1.0.0.Final.jar 

Trong dự án .ear của bạn, thêm hibernate-JPA-2,0-api-1.0. 0.Final.jar vào thư mục 'lib' tại gốc dự án của bạn. Nếu không có thư mục 'lib' ở đó, hãy tạo một thư mục. Sau đó, trong /META-INF/MANIFEST.MF, hãy đảm bảo dòng Class-Path đọc:

Class-Path: /lib/hibernate-jpa-2.0-api-1.0.0.Final.jar 

Đảm bảo tất cả các tệp được lưu và tạo một bản dựng rõ ràng. Sau đó xuất khẩu .ear và triển khai nó như thường lệ bởi Bảng điều khiển giải pháp tích hợp. Nhưng có một điều khác bạn phải làm trước khi thay đổi sẽ hoạt động; nó yêu cầu thay đổi chính sách tải lớp cho ứng dụng, nhưng không yêu cầu máy chủ. Bạn có nhiều khả năng để có được quản trị viên WAS của bạn để đi cho rằng hơn là thay đổi chính sách classloader cho toàn bộ máy chủ. Để thực hiện thay đổi cần thiết, sau khi cài đặt tệp .ear, hãy làm theo thanh điều hướng bên trái, nhấp vào đường nhỏ "Applications\Application Types\Websphere enterprise applications" và nhấp vào tên ứng dụng của bạn, sau đó nhấp vào "Tải lớp học và update detection". Sau đó chọn "Classes loaded with local class loader first (parent last)" theo "Class loader order", sau đó nhấp vào Apply, sau đó Save Bây giờ lại nhấp chuột trail "Applications\Application Types\Websphere enterprise applications", hoặc là bắt đầu hoặc khởi động lại ứng dụng của bạn Kiểm tra ra ứng dụng của bạn và hy vọng bạn sẽ được tốt để đi

cuối cùng lưu ý:... Evey khi bạn tái triển khai tập tin .ear của bạn, bạn sẽ cần đặt tùy chọn trình nạp lớp mà tôi vừa thảo luận. Tùy chọn này không được giữ lại giữa các lần triển khai.

+0

Maven sạch FTW. Tôi đã xóa hibernate-jpa từ pom nhưng vẫn gặp lỗi và quên làm sạch trong 3 ngày :(! CẢM ƠN! – Atais

+0

Điều này cũng phù hợp với tôi! Tôi đang sử dụng WebSphere 7 với MyEclipse Blue Edition. Để duy trì các thay đổi của trình nạp lớp trong MyEclipse 1. Từ bên trong MyEclipse, mở tệp META-INF/ibmconfig/application.xml trong dự án EAR 2. Chọn tab "Cấu hình ứng dụng". 3. Dưới " 1. Chọn dự án WAR, sau đó chọn "PARENT_LAST" cho chế độ "Trình nạp lớp" 5. Chọn dự án EAR, sau đó chọn "PARENT_LAST" cho "chế độ Classloader". 6. Bạn có thể cần cập nhật thông tin dự án Maven và confi dự án gurations. –

+0

@red tiger: Cảm ơn bạn đã tip, tôi sẽ thử điều đó. –

0

Đặt chính sách trình nạp lớp ứng dụng của máy chủ của bạn thành cha mẹ cuối cùng sẽ giải quyết vấn đề này miễn là bạn đảm bảo tệp jar hibernate-jpa-2.0-api được bao gồm trong EAR. Nếu điều này có thể trong môi trường của bạn thì đó là một giải pháp dễ dàng hơn nhiều.

Đã thử nghiệm trên WebSphere 7.

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