Masalah Hibernasi - “Penggunaan @OneToMany atau @ManyToMany menargetkan kelas yang belum dipetakan”


113

Saya menemukan kaki saya dengan Hibernate Annotations dan saya telah mengalami masalah yang saya harap seseorang dapat membantu.

Saya memiliki 2 entitas, Bagian dan ScopeTopic. Bagian tersebut memiliki anggota kelas Daftar, jadi hubungan Satu dengan Banyak. Ketika saya menjalankan pengujian unit saya, saya mendapatkan pengecualian ini:

Penggunaan @OneToMany atau @ManyToMany yang menargetkan kelas yang belum dipetakan: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

Saya akan berasumsi bahwa kesalahan menyiratkan bahwa entitas ScopeTopic saya tidak dipetakan ke tabel? Saya tidak bisa melihat dengan saya telah melakukan kesalahan. Berikut adalah kelas-kelas Entity:


@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;
    }
}

Saya cukup yakin itu adalah kesalahan saya sendiri sehingga beberapa panduan akan sangat bagus, terima kasih!

Jawaban:


247

Anotasi Anda terlihat bagus. Berikut hal-hal yang perlu diperiksa:

  • pastikan anotasinya adalah javax.persistence.Entity, dan bukan org.hibernate.annotations.Entity. Yang pertama membuat entitas dapat dideteksi. Yang terakhir hanyalah tambahan.

  • jika Anda mendaftar entitas Anda secara manual (di persistence.xml, di hibernate.cfg.xml, atau saat mengonfigurasi pabrik sesi Anda), maka pastikan Anda juga telah mencantumkan ScopeTopicentitas tersebut

  • pastikan Anda tidak memiliki banyak ScopeTopickelas dalam paket yang berbeda, dan Anda telah mengimpor yang salah.


19
Ah terima kasih! Poin 2 adalah kuncinya, saya lupa meletakkan ScopeTopic di daftar properti annotatedClasses saya saat membuat SessionFactory, kesalahan n00b!
C0deAttack

4
Bagi mereka yang baru saja memukul komentar ini. org.hibernate.annotations.Entity tidak digunakan lagi dalam mode Hibernate 4. Poin 1 tidak berlaku lagi.
gspatel

Bagi saya itu adalah poin 2, karena saya terus mengedit hibernate.cfg.xml di folder build saya.
Torsten

Di Spring Boot, saya mengalami masalah di sini, dan poin 2 adalah yang membantu saya menyelesaikannya. Saya telah membiarkan Spring Boot mengonfigurasi pabrik sesi saya secara otomatis, dan di satu cabang saya telah menambahkan entitas baru ... lalu sebelum yang satu itu digabungkan, saya memiliki cabang lain di mana saya harus menyesuaikan pabrik sesi. Kedua cabang digabungkan pada saat yang sama dan saya mendapatkan kesalahan yang tercantum dalam masalah ini. Entitas baru saya tidak lagi dipindai otomatis dengan boot musim semi karena saya telah mengonfigurasi pabrik sesi dan tidak berpikir untuk menyertakan entitas baru dari cabang lain.
AEvans

Dalam kasus saya, saya lupa memindai paket menggunakanpackagesToScan
Siva

24

Milik saya tidak memiliki @Entityentitas banyak sisi

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

22

Entitas Anda mungkin tidak terdaftar dalam file konfigurasi hibernasi.


7

Sebagian besar Hibernate, perlu menambahkan Entitykelas hibernate.cfg.xmlseperti-

<hibernate-configuration>
  <session-factory>

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

3

Jika Anda menggunakan konfigurasi Java dalam proyek spring-data-jpa, pastikan Anda memindai paket tempat entitas itu berada. Misalnya, jika entitas menjalankan com.foo.myservice.things, maka anotasi konfigurasi berikut tidak akan ambil itu.

Anda dapat memperbaikinya dengan melonggarkannya hingga hanya com.foo.myservice (tentu saja, perhatikan efek lain dari memperluas cakupan Anda untuk memindai entitas).

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

1

Saya memiliki masalah yang sama dan saya dapat menyelesaikannya dengan menambahkan entitas ke dalam persistence.xml. Masalah ini disebabkan karena entitas tidak ditambahkan ke konfigurasi persistensi. Edit file persistensi Anda:

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

...


1

Dalam kasus saya, a harus menambahkan kelas saya, saat membangun SessionFactory, denganaddAnnotationClass

Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
            .addAnnotatedClass(MyEntity1.class)
            .addAnnotatedClass(MyEntity2.class)
            .buildSessionFactory(builder.build());
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.