Vấn đề ở chế độ ngủ đông - “Việc sử dụng @OneToMany hoặc @ManyToMany nhắm mục tiêu một lớp chưa được ánh xạ”


113

Tôi đang tìm kiếm chân của mình với Chú thích ngủ đông và tôi đã gặp sự cố mà tôi mong ai đó có thể giúp đỡ.

Tôi có 2 thực thể, Section và ScopeTopic. Phần có một thành viên lớp Danh sách, do đó, một mối quan hệ Một đến Nhiều. Khi tôi chạy thử nghiệm đơn vị của mình, tôi nhận được ngoại lệ này:

Sử dụng @OneToMany hoặc @ManyToMany nhắm mục tiêu một lớp chưa được ánh xạ: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

Tôi giả định rằng lỗi ngụ ý rằng thực thể ScopeTopic của tôi không được ánh xạ tới một bảng? Tôi không thể thấy với tôi đã làm sai. Đây là các lớp Thực thể:


@Entity
public class Section {
    private Long id;
    private List<ScopeTopic> scopeTopics;

    public Section() {}

    @Id
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @OneToMany
    @JoinTable(name = "section_scope", joinColumns = {@JoinColumn(name="section_id")},
               inverseJoinColumns = {@JoinColumn(name="scope_topic_id")} )
    public List<ScopeTopic> getScopeTopic() {
        return scopeTopic;
    }

    public void setScopeTopic(List<ScopeTopic> scopeTopic) {
        this.scopeTopic = scopeTopic;
    }
}

@Entity
@Table(name = "scope_topic")
public class ScopeTopic {
    private Long id;
    private String topic;

    public ScopeTopic() {}

    @Id
    public Long getId() {
        return id;
    }

    public void setId() {
        this.id = id;
    }

    public String getTopic() {
        return topic;
    }

    public void setTopic(String topic) {
        this.topic = topic;
    }
}

Tôi khá chắc rằng đó là lỗi của chính tôi vì sự thiếu hiểu biết của tôi nên một số hướng dẫn sẽ rất hay, cảm ơn!

Câu trả lời:


247

Chú thích của bạn trông ổn. Dưới đây là những điều cần kiểm tra:

  • đảm bảo rằng chú thích là javax.persistence.Entity, và không org.hibernate.annotations.Entity. Cái trước làm cho thực thể có thể phát hiện được. Sau này chỉ là một bổ sung.

  • nếu bạn đang liệt kê các thực thể của mình theo cách thủ công (trong Persence.xml, trong hibernate.cfg.xml hoặc khi định cấu hình nhà máy phiên của bạn), thì hãy đảm bảo rằng bạn cũng đã liệt kê ScopeTopicthực thể

  • đảm bảo rằng bạn không có nhiều ScopeTopiclớp trong các gói khác nhau và bạn đã nhập sai.


19
Ah, cảm ơn! Điểm 2 là chìa khóa, tôi đã quên đặt ScopeTopic trong danh sách thuộc tính annotatedClasses của mình khi tạo SessionFactory, lỗi n00b!
C0deAttack

4
Đối với những người chỉ nhấn bình luận này. org.hibernate.annotations.Entity không được chấp nhận trong Hibernate 4. Điểm 1 không áp dụng nữa.
gspatel

Đối với tôi, đó là điểm 2, vì tôi tiếp tục chỉnh sửa hibernate.cfg.xml trong thư mục xây dựng của mình.
Torsten

Trong Spring Boot, tôi đã gặp phải một lỗi ở đây và điểm 2 là điều đã giúp tôi giải quyết nó. Tôi đã để Spring Boot tự động định cấu hình nhà máy phiên của mình và trong một nhánh, tôi đã thêm một thực thể mới ... sau đó trước khi thực thể đó được hợp nhất, tôi đã có một nhánh khác mà tôi phải tùy chỉnh nhà máy phiên. Cả hai chi nhánh đã được hợp nhất cùng một lúc và tôi đã gặp lỗi được liệt kê trong sự cố này. Thực thể mới của tôi không còn được quét tự động bằng khởi động mùa xuân nữa vì tôi đã định cấu hình phiên họp và không nghĩ đến việc bao gồm các thực thể mới từ các nhánh khác.
AEvans

Trong trường hợp của tôi, tôi quên để quét các gói sử dụngpackagesToScan
Siva

24

Của tôi không có @Entitynhiều thực thể bên

@Entity // this was commented
@Table(name = "some_table")
public class ChildEntity {
    @JoinColumn(name = "parent", referencedColumnName = "id")
    @ManyToOne
    private ParentEntity parentEntity;
}

22

Thực thể của bạn có thể không được liệt kê trong tệp cấu hình ngủ đông.


7

Hầu hết trong Hibernate, cần thêm Entitylớp trong hibernate.cfg.xmlnhư-

<hibernate-configuration>
  <session-factory>

    ....
    <mapping class="xxx.xxx.yourEntityName"/>
 </session-factory>
</hibernate-configuration>

3

Nếu bạn đang sử dụng cấu hình Java trong một dự án spring-data-jpa, hãy đảm bảo rằng bạn đang quét gói mà thực thể đang ở trong đó. Ví dụ: nếu thực thể sống com.foo.myservice.things thì chú thích cấu hình bên dưới sẽ không nhặt nó lên.

Bạn có thể sửa nó bằng cách nới lỏng nó thành chỉ com.foo.myservice (tất nhiên, hãy nhớ bất kỳ tác động nào khác của việc mở rộng phạm vi của bạn để quét các thực thể).

@Configuration
@EnableJpaAuditing
@EnableJpaRepositories("com.foo.myservice.repositories")
public class RepositoryConfiguration {
}

1

Trong trường hợp của tôi, a phải thêm các lớp của tôi, khi xây dựng SessionFactory, vớiaddAnnotationClass

Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
            .addAnnotatedClass(MyEntity1.class)
            .addAnnotatedClass(MyEntity2.class)
            .buildSessionFactory(builder.build());

0

Tôi đã gặp vấn đề tương tự và tôi có thể giải quyết nó bằng cách thêm thực thể vào Persence.xml. Sự cố được gây ra do thực thể không được thêm vào cấu hình độ bền. Chỉnh sửa tệp tồn tại của bạn:

<persistence-unit name="MY_PU" transaction-type="RESOURCE_LOCAL">
<provider>`enter code here`
     org.hibernate.jpa.HibernatePersistenceProvider
  </provider>
<class>mypackage.MyEntity</class>

...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.