Hazırda bekletme sorunu - "Eşleştirilmemiş bir sınıfı hedefleyen @OneToMany veya @ManyToMany kullanımı"


114

Ayaklarımı Hazırda Bekletme Ek Açıklamaları ile buluyorum ve birinin yardımcı olabileceğini umduğum bir sorunla karşılaştım.

Bölüm ve Kapsam Konusu olmak üzere 2 varlığım var. Bölümün bir List sınıfı üyesi vardır, bu nedenle Bire Çok ilişkisi vardır. Birim testimi çalıştırdığımda şu istisnayı alıyorum:

Eşlenmemiş bir sınıfı hedefleyen @OneToMany veya @ManyToMany kullanımı: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

Hatanın ScopeTopic varlığımın bir tabloyla eşlenmediğini ima ettiğini varsayabilirim? Yanlış yaptığımı göremiyorum. Varlık sınıfları şunlardır:


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

Eminim ki bu benim anlayış eksikliğimdir, bu yüzden biraz rehberlik harika olur, teşekkürler!

Yanıtlar:


248

Ek açıklamalarınız iyi görünüyor. İşte kontrol edilecek şeyler:

  • ek açıklamanın olduğundan javax.persistence.Entityve olmadığından emin olun org.hibernate.annotations.Entity. İlki, varlığı tespit edilebilir hale getirir. İkincisi sadece bir eklemedir.

  • (oturumunuz fabrika yapılandırırken hibernate.cfg.xml içinde, persistence.xml içinde veya) manuel varlıkları listeliyorsanız, o zaman emin olun siz de listeledik ScopeTopicvarlık

  • ScopeTopicfarklı paketlerde birden fazla sınıfınız olmadığından ve yanlış olanı içe aktardığınızdan emin olun .


19
Ah teşekkürler! Nokta 2 anahtardı, SessionFactory'yi oluştururken ScopeTopic'i annotatedClasses özellik listeme koymayı unutmuştum, n00b hatası!
C0deAttack

4
Sadece bu yoruma uyanlar için. org.hibernate.annotations.Entity, Hazırda Bekletme 4'te kullanımdan kaldırıldı. Nokta 1 artık geçerli değil.
gspatel

Benim için bu nokta 2 idi, çünkü derleme klasörümdeki hibernate.cfg.xml dosyasını düzenlemeye devam ettim.
Torsten

Spring Boot'ta burada bir sorunla karşılaştım ve 2. nokta bunu çözmeme yardımcı oldu. Spring Boot'un oturum fabrikamı otomatik olarak yapılandırmasına izin veriyordum ve bir şubede yeni bir varlık ekledim ... daha sonra bu birleştirme işleminden önce, oturum fabrikasını özelleştirmem gereken başka bir şubem vardı. Her iki şube aynı anda birleştirildi ve bu problemde listelenen hatayı aldım. Oturum fabrikasını yapılandırdığım ve diğer dallardan yeni varlıkları dahil etmeyi düşünmediğim için yeni varlığım artık ilkbahar önyüklemesi tarafından otomatik olarak taranmıyordu.
AEvans

Benim durumumda paketi kullanarak taramayı unuttumpackagesToScan
Siva

24

Benimki @Entitypek çok tarafa sahip değildi

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

22

Varlığınız hazırda bekletme yapılandırma dosyasında listelenmemiş olabilir.


7

Çoğunlukla içinde Hibernate, Entitysınıfı hibernate.cfg.xmlbenzer şekilde eklemeniz gerekir.

<hibernate-configuration>
  <session-factory>

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

3

Spring-data-jpa projesinde Java yapılandırması kullanıyorsanız, varlığın içinde bulunduğu paketi taradığınızdan emin olun. Örneğin, varlık com.foo.myservice.things yaşıyorsa aşağıdaki yapılandırma ek açıklaması yapılmaz onu al.

Bunu sadece com.foo.myservice olarak gevşeterek düzeltebilirsiniz (elbette, varlıkları taramak için kapsamınızı genişletmenin diğer etkilerini aklınızda bulundurun).

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

1

Aynı sorunu yaşadım ve varlığı persistence.xml'ye ekleyerek çözebilirdim. Sorunun nedeni, varlığın kalıcılık yapılandırmasına eklenmemiş olmasıdır. Kalıcılık dosyanızı düzenleyin:

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

...


1

Benim durumumda bir bina benim sınıfları eklemek zorundadır SessionFactoryile,addAnnotationClass

Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
            .addAnnotatedClass(MyEntity1.class)
            .addAnnotatedClass(MyEntity2.class)
            .buildSessionFactory(builder.build());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.