ปัญหาไฮเบอร์เนต -“ การใช้ @OneToMany หรือ @ManyToMany กำหนดเป้าหมายคลาสที่ไม่ได้แมป”


114

ฉันพบว่าเท้าของฉันมีคำอธิบายประกอบไฮเบอร์เนตและฉันประสบปัญหาฉันหวังว่าจะมีคนช่วยได้

ฉันมี 2 เอนทิตีมาตราและขอบเขต ส่วนนี้มีสมาชิกคลาส List ดังนั้นความสัมพันธ์แบบหนึ่งต่อกลุ่ม เมื่อฉันเรียกใช้การทดสอบหน่วยฉันได้รับข้อยกเว้นนี้:

การใช้ @OneToMany หรือ @ManyToMany กำหนดเป้าหมายคลาสที่ไม่ได้แมป: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

ฉันจะถือว่าข้อผิดพลาดหมายความว่าเอนทิตี ScopeTopic ของฉันไม่ได้แมปกับตาราง? ฉันไม่เห็นว่าฉันทำผิด คลาสเอนทิตีมีดังนี้


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

ฉันค่อนข้างมั่นใจว่าตัวเองขาดความเข้าใจซึ่งเป็นความผิดดังนั้นคำแนะนำบางอย่างจะดีมากขอบคุณ!

คำตอบ:


248

คำอธิบายประกอบของคุณดูดี สิ่งที่ต้องตรวจสอบมีดังนี้

  • ให้แน่ใจว่าคำอธิบายประกอบเป็นและไม่javax.persistence.Entity org.hibernate.annotations.Entityอดีตทำให้สามารถตรวจพบเอนทิตีได้ หลังเป็นเพียงการเพิ่ม

  • หากคุณแสดงรายการเอนทิตีของคุณด้วยตนเอง (ใน persistence.xml ใน hibernate.cfg.xml หรือเมื่อกำหนดค่าโรงงานเซสชันของคุณ) ให้ตรวจสอบว่าคุณได้แสดงรายการScopeTopicเอนทิตีด้วย

  • ตรวจสอบให้แน่ใจว่าคุณไม่มีหลายScopeTopicคลาสในแพ็คเกจที่แตกต่างกันและคุณได้นำเข้าคลาสผิด


19
ขอบคุณมาก! จุดที่ 2 เป็นกุญแจสำคัญฉันลืมใส่ ScopeTopic ในรายการคุณสมบัติ annotatedClasses ของฉันเมื่อสร้าง SessionFactory ข้อผิดพลาด n00b!
C0deAttack

4
สำหรับผู้ที่กดเข้ามาแสดงความคิดเห็นนี้ org.hibernate.annotations.Entity เลิกใช้งานใน Hibernate 4 จุดที่ 1 ใช้ไม่ได้อีกต่อไป
gspatel

สำหรับฉันมันเป็นจุดที่ 2 เพราะฉันยังคงแก้ไข hibernate.cfg.xml ในโฟลเดอร์บิลด์ของฉัน
Torsten

ใน Spring Boot ฉันเจอ gotcha ที่นี่และจุดที่ 2 คือสิ่งที่ช่วยฉันแก้ปัญหาได้ ฉันปล่อยให้ Spring Boot กำหนดค่าโรงงานเซสชันของฉันโดยอัตโนมัติและในสาขาหนึ่งฉันได้เพิ่มเอนทิตีใหม่ ... จากนั้นก่อนที่จะรวมเข้าด้วยกันฉันมีสาขาอื่นที่ฉันต้องปรับแต่งโรงงานเซสชัน ทั้งสองสาขาถูกรวมในเวลาเดียวกันและฉันได้รับข้อผิดพลาดที่ระบุไว้ในปัญหานี้ เอนทิตีใหม่ของฉันไม่ได้รับการสแกนอัตโนมัติโดยสปริงบูตอีกต่อไปเนื่องจากฉันได้กำหนดค่า sessionfactory แล้วและไม่คิดที่จะรวมเอนทิตีใหม่จากสาขาอื่น
AEvans

ในกรณีของฉันฉันลืมสแกนแพ็คเกจโดยใช้packagesToScan
Siva

24

ของฉันไม่ได้มี@Entityอยู่ในหลาย ๆ ด้าน

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


7

ส่วนใหญ่Hibernateต้องเพิ่มEntityคลาสในhibernate.cfg.xmllike-

<hibernate-configuration>
  <session-factory>

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

3

หากคุณใช้คอนฟิกูเรชัน Java ในโปรเจ็กต์ spring-data-jpa ตรวจสอบให้แน่ใจว่าคุณกำลังสแกนแพ็กเกจที่เอนทิตีอยู่ตัวอย่างเช่นหากเอนทิตีอาศัยcom.foo.myservice.thingsคำอธิบายประกอบการกำหนดค่าต่อไปนี้ด้านล่างจะไม่ หยิบมันขึ้นมา.

คุณสามารถแก้ไขได้โดยคลายออกเป็นแค่com.foo.myservice (แน่นอนว่าโปรดจำไว้ว่าผลกระทบอื่น ๆ ของการขยายขอบเขตของคุณเพื่อสแกนหาเอนทิตี)

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

1

ฉันมีปัญหาเดียวกันและฉันสามารถแก้ไขได้โดยเพิ่มเอนทิตีลงใน persistence.xml ปัญหาเกิดจากข้อเท็จจริงที่ว่าไม่มีการเพิ่มเอนทิตีในการกำหนดค่าการคงอยู่ แก้ไขไฟล์การคงอยู่ของคุณ:

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

...


1

ในกรณีของฉันต้องเพิ่มชั้นเรียนของฉันเมื่อสร้างSessionFactoryด้วยaddAnnotationClass

Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
            .addAnnotatedClass(MyEntity1.class)
            .addAnnotatedClass(MyEntity2.class)
            .buildSessionFactory(builder.build());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.