सीतनिद्रा में होना समस्या - "@OneToMany का उपयोग करें या @ManyToMany लक्ष्यहीन वर्ग को लक्षित करें"


113

मैं अपने पैरों को हाइबरनेट एनोटेशंस के साथ पा रहा हूं और मैंने एक समस्या को मारा है मुझे आशा है कि कोई व्यक्ति आपकी मदद कर सकता है।

मेरे पास 2 संस्थाएं हैं, अनुभाग और स्कोपोपिक। अनुभाग में एक सूची वर्ग सदस्य है, इसलिए एक से कई संबंध हैं। जब मैं अपना यूनिट परीक्षण चलाता हूं तो मुझे यह अपवाद मिल रहा है:

@OneToMany या @ManyToMany का उपयोग एक अनकैप्ड वर्ग को लक्षित करते हुए: com.xxx.domain.Section.scopeTopic [com.xxx.domain.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;
    }
}

मुझे पूरा यकीन है कि यह मेरी अपनी समझ की कमी है जो गलती पर है इसलिए कुछ मार्गदर्शन बहुत अच्छा होगा, धन्यवाद!

जवाबों:


247

आपकी टिप्पणी ठीक दिखती है। यहाँ जाँच करने के लिए चीजें हैं:

  • सुनिश्चित करें कि एनोटेशन है javax.persistence.Entity, और नहीं org.hibernate.annotations.Entity। पूर्व इकाई को पता लगाने योग्य बनाता है। उत्तरार्द्ध सिर्फ एक जोड़ है।

  • यदि आप मैन्युअल रूप से अपनी संस्थाओं को सूचीबद्ध कर रहे हैं (persistence.xml में, hibernate.cfg.xml में, या अपने सत्र कारखाने को कॉन्फ़िगर करते समय), तो सुनिश्चित करें कि आपने ScopeTopicइकाई भी सूचीबद्ध कर ली है

  • सुनिश्चित करें कि आपके पास ScopeTopicअलग-अलग पैकेजों में कई कक्षाएं नहीं हैं , और आपने गलत आयात किया है।


19
आह, धन्यवाद! प्वाइंट 2 की कुंजी थी, मैं SessionFactory, n00b त्रुटि बनाते समय ScopeTopic को अपनी एनोटेटक्लास संपत्ति सूची में रखना भूल गया था!
C0deAttack

4
सिर्फ इस टिप्पणी को मारने वालों के लिए। org.hibernate.annotations.Entity हाइबरनेट 4 में पदावनत है। बिंदु 1 अब लागू नहीं होता है।
gspatel

मेरे लिए यह बिंदु 2 था, क्योंकि मैं अपने बिल्ड फ़ोल्डर में hibernate.cfg.xml का संपादन करता रहा।
टॉरस्टेन

स्प्रिंग बूट में, मैं यहां एक गोच में चला गया, और बिंदु 2 वह है जिसने मुझे इसे हल करने में मदद की। मैं स्प्रिंग बूट ऑटो को अपने सत्र कारखाने को कॉन्फ़िगर करने दे रहा था, और एक शाखा में मैंने एक नई इकाई जोड़ी थी ... फिर इससे पहले कि एक विलय हो जाता, मेरे पास एक और शाखा थी जहां मुझे सत्र कारखाने को अनुकूलित करना था। एक ही समय में दोनों शाखाओं का विलय हो गया और मुझे इस समस्या में सूचीबद्ध त्रुटि मिली। मेरी नई इकाई अब स्प्रिंग बूट द्वारा स्वत: स्कैन नहीं की गई थी क्योंकि मैंने सत्रफैक्ट को कॉन्फ़िगर किया था और अन्य शाखाओं से नई संस्थाओं को शामिल करने के लिए नहीं सोचा था।
AEvans

मेरे मामले में मैं पैकेज का उपयोग करना भूल गयाpackagesToScan
शिव

24

मेरा @Entityकई पक्ष इकाई पर नहीं था

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

22

आपकी इकाई हाइबरनेट कॉन्फ़िगरेशन फ़ाइल में सूचीबद्ध नहीं हो सकती है।


7

ज्यादातर में Hibernate, Entityवर्ग को जोड़ने की जरूरत है hibernate.cfg.xmlजैसे-

<hibernate-configuration>
  <session-factory>

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

3

यदि आप एक स्प्रिंग-डेटा-जेपा परियोजना में जावा कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप उस पैकेज को स्कैन कर रहे हैं जो इकाई में है। उदाहरण के लिए, यदि इकाई com.foo.myservice.things रहती थी, तो नीचे दिए गए कॉन्फ़िगरेशन एनोटेशन नहीं होगा। इसे उठाएं।

आप इसे केवल com.foo.myservice तक ढीला करके ठीक कर सकते हैं (बेशक, संस्थाओं के लिए स्कैन करने के लिए अपने दायरे को व्यापक बनाने के किसी भी अन्य प्रभाव को ध्यान में रखें)।

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

1

मुझे एक ही समस्या थी और मैं इसे अस्तित्व में दृढ़ता के साथ जोड़कर हल कर सकता था। 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());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.