2011-09-08 14 views
6

Tôi nhận được ngoại lệ Hibernate sau:org.hibernate.AnnotationException: @OneToOne hoặc @ManyToOne trên tài liệu tham khảo <entity> một thực thể chưa biết

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on cz.rohan.dusps.model.Switchport.konfiguracniTemplateAccess references an unknown entity: cz.rohan.dusps.model.KonfiguracniTemplate 
    org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:103) 
    org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541) 
    org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523) 
    org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380) 
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377) 
    org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) 
    cz.rohan.dusps.helper.SessionFactoryHelper.initFactory(SessionFactoryHelper.java:122) 
    cz.rohan.dusps.helper.SessionFactoryHelper.getSessionFactory(SessionFactoryHelper.java:134) 
    cz.rohan.dusps.filter.HistorieZmenFilter.doFilter(HistorieZmenFilter.java:102) 
    cz.rohan.dusps.filter.CharsetFilter.doFilter(CharsetFilter.java:41) 

sau ~ 20 giờ chi cho các vấn đề với những người khác nhau, sau khi đọc từng blog hoặc diễn đàn có thể, tôi thực sự đang tuyệt vọng ở đây.

Đây là dự án cỡ trung bình. Tôi nên đề cập đến cơ sở dữ liệu là Postgres 9.1 và chúng tôi tạo ra DB bằng cách sử dụng một công cụ mô hình hóa. Hibernate kết nối với cơ sở dữ liệu nhưng không tạo ra nó.

Tôi đã tạo một thực thể mới trong cơ sở dữ liệu, nó được gọi là "KonfiguracniTemplate" (mẫu cấu hình). Tôi đã tạo ra mô hình, bộ điều khiển, biểu mẫu, trình duyệt tính hợp lệ, .jsp's, tất cả về cơ bản được sao chép 1: 1 từ một thực thể hiện có có tính chất tương tự. Bây giờ tôi có thể làm việc với KonfiguracniTemplate, CRUD hoàn toàn hoạt động.

Sự cố xảy ra khi tôi tham khảo KonfiguracniTemplate này từ thực thể được gọi là Switchport. Trong DB có một mối quan hệ giữa hai:

  • switchport 1: 1 ... 0: N KonfiguracniTemplate (switchport luôn tham khảo một KonfiguracniTemplate; một KonfiguracniTemplate CÓ THỂ tham chiếu zero hoặc nhiều lần)
  • switchport có FK konfiguracniTemplateAccess_id cho mối quan hệ này.

Trong .../mô hình/Switchport.java mối quan hệ được ánh xạ giống như tất cả các mối quan hệ khác mà đang làm việc:

@ManyToOne 
@JoinColumn(nullable = false) 
private KonfiguracniTemplate konfiguracniTemplateAccess; 

Tôi đã thử nhiều hình thức:

@ManyToOne 
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false) 
private KonfiguracniTemplate konfiguracniTemplateAccess; 

hoặc

@ManyToOne(targetEntity=KonfiguracniTemplate.class) 
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false) 
private KonfiguracniTemplate konfiguracniTemplateAccess; 

Tôi cũng đã kiểm tra:

  • cả các đơn vị trong cùng một gói
  • họ đều chú thích "@Entity" sử dụng "javax.persistence.Entity nhập khẩu;"
  • xây dựng sản xuất không có thông báo lỗi/cảnh báo
  • miễn là tài liệu tham khảo trong switchport là nhận xét ra, mọi thứ đều tốt

Không có vấn đề gì tôi cố gắng tôi không thể thoát khỏi những "tài liệu tham khảo một thực thể chưa biết " ngoại lệ. Ai đó có thể xin vui lòng chia sẻ một ý tưởng những gì đang xảy ra hoặc có thể làm thế nào để gỡ lỗi vấn đề? Stacktrace ở đầu bài viết là tất cả những gì tôi nhận được trong nhật ký.

Tất cả đầu vào đều được đánh giá cao!

+0

điều này có xảy ra sau khi xây dựng hoặc đang phát triển không? Thử nghiệm đơn vị của bạn có chạy không? – hvgotcodes

+0

Đây là ngoại lệ thời gian chạy. Việc xây dựng thành công, sau đó tôi có thể truy cập biểu mẫu đăng nhập, gửi và tôi nhận được ngoại lệ. Chúng tôi không làm bài kiểm tra đơn vị. – Martin

+0

bạn đã kiểm tra bình và chắc chắn rằng tệp lớp cho lớp bị thiếu có trong jar sau khi xây dựng không? – hvgotcodes

Trả lời

1

Cuối cùng đã nhận được giải pháp từ một nhà phát triển khác trong nhóm!

Các lớp cần được nhập trước khi đối tượng SessionFactory được tạo. Ở đây, việc nhập cho lớp mới bị thiếu, vì vậy nó không được biết đến đối tượng SessionFactory.

Dù sao, cảm ơn mọi người vì gợi ý của bạn!

+10

chính xác bạn giải quyết vấn đề này như thế nào? Bạn đã chỉnh sửa tệp nào? Bạn có thể nêu chi tiết hơn về chính xác bạn đã làm gì không. – riship89

9

Chỉ cần thêm lớp Đội đến "hibernate-cfg.xml" tập tin, vì Hibernate không xác định mà không cần thêm vào nó.

0

Có thêm một cơ hội nhận ngoại lệ như vậy; khi bạn không đề cập đến lớp ánh xạ của mình trong tệp hibernate.cfg.xml. Như đã đề cập ở trên.

2

Giải pháp có thể:

1) Đảm bảo rằng các thực thể đã được nhắc đến một cách thích hợp trong hibernate.cfg.xml

<hibernate-configuration> 
<session-factory> 
    ... 
    <mapping class="com.project.entitytwo.model.EntityTwo"/> 
    ... 
</session-factory> 

2) Đảm bảo rằng @Entity đã được quy định tại các lớp -level (ở đầu lớp)

@Entity 
@Table(name="ENTITY_TWO") 
public class EntityTwo extends AnyClass 
{ 
    ... 
0

Tôi đã có cùng một exc eption ... Tôi chỉ cần quên thêm chú thích (@Entity, và @Table) trên lớp Master (lớp với Tiểu học trọng điểm)

vì vậy giải pháp là kiểm tra lại tất cả các chú thích trong các đơn vị của bạn, tôi có nghĩa là không chỉ @ManyToOne@OneToMany như tôi đã làm.

1

Tôi vừa gặp sự cố này, với thực thể a tham chiếu pháp nhân b. Cả hai thực thể đều nằm trong một JAR chung bên ngoài dự án web mà tôi đang làm việc; a được khai báo trong persistence.xml nhưng không phải là b. Tôi đặt b trong một thẻ <class> trong persistence.xml và nó hoạt động!

+1

Cảm ơn bạn @Nick. Bạn đã cứu mạng tôi. –

+1

@VictorViola Bạn được chào đón; mừng vì tôi có thể giúp! – Nick

1

Tôi gặp vấn đề này khi sử dụng Spring và không sử dụng tệp hibernate.cfg.xml. Nó đã được giải quyết bằng cách thêm tên gói đủ điều kiện của lớp Model vào phương thức setPackagesToScan của lớp LocalSessionFactoryBean.