org.hibernate.AnnotationException: @OneToOne или @ManyToOne в <entity>ссылаются на неизвестную сущность - PullRequest
7 голосов
/ 08 сентября 2011

Я получаю следующее исключение Hibernate:

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on cz.rohan.dusps.model.Switchport.konfiguracniTemplateAccess references an unknown entity: cz.rohan.dusps.model.KonfiguracniTemplate
    org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:103)
    org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541)
    org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523)
    org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380)
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377)
    org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
    cz.rohan.dusps.helper.SessionFactoryHelper.initFactory(SessionFactoryHelper.java:122)
    cz.rohan.dusps.helper.SessionFactoryHelper.getSessionFactory(SessionFactoryHelper.java:134)
    cz.rohan.dusps.filter.HistorieZmenFilter.doFilter(HistorieZmenFilter.java:102)
    cz.rohan.dusps.filter.CharsetFilter.doFilter(CharsetFilter.java:41)

после ~ 20 часов, потраченных на проблему с разными людьми, прочитав каждый возможный блог или форум, я действительно впадаю в отчаяние.

Это проект среднего размера. Я должен упомянуть, что база данных - Postgres 9.1, и мы генерируем базу данных с помощью инструмента моделирования. Hibernate подключается к базе данных, но не генерирует ее.

Я создал новый объект в базе данных, он называется "KonfiguracniTemplate" (шаблон конфигурации). Я создал модель, контроллер, форму, валидаторы, файлы .jsp, все в основном скопировал 1: 1 из существующей сущности аналогичной природы. Теперь я могу работать с KonfiguracniTemplate, CRUD полностью работает.

Проблема возникает, когда я ссылаюсь на этот KonfiguracniTemplate из сущности, называемой Switchport. В БД есть связь между двумя:

  • Switchport 1: 1 ... 0: N KonfiguracniTemplate (switchport всегда ссылается на KonfiguracniTemplate; на KonfiguracniTemplate МОЖЕТ БЫТЬ ссылка ноль или более раз)
  • В Switchport есть FK konfiguracniTemplateAccess_id для этого отношения.

В ... / model / Switchport.java отношение отображается так же, как и все другие рабочие отношения:

@ManyToOne
@JoinColumn(nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

Я пробовал разные формы:

@ManyToOne
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

или

@ManyToOne(targetEntity=KonfiguracniTemplate.class)
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

Я также проверил:

  • оба объекта находятся в одном пакете
  • они оба помечены как "@Entity" с помощью "import javax.persistence.Entity;"
  • сборка не выдает сообщений об ошибках / предупреждений
  • Пока ссылка в Switchport закомментирована, все в порядке

Независимо от того, что я пытаюсь, я не могу избавиться от исключения "указывает на неизвестную сущность". Может кто-нибудь, пожалуйста, поделитесь идеей, что происходит или, возможно, как отладить проблему? Отслеживание стека вверху поста - это все, что я получаю в логах.

Весь вклад приветствуется!

Ответы [ 8 ]

10 голосов
/ 03 сентября 2013

Просто добавьте класс Team в файл " hibernate-cfg.xml ", потому что Hibernate не идентифицируется без добавления в него.

2 голосов
/ 27 июня 2014

Возможные решения:

1) Убедитесь, что ссылка на сущность была правильно указана в hibernate.cfg.xml

<hibernate-configuration>
<session-factory>
    ... 
    <mapping class="com.project.entitytwo.model.EntityTwo"/>
    ...
</session-factory>

2) Убедитесь, что @Entityбыло указано на уровне класса (наверху класса)

@Entity
@Table( name="ENTITY_TWO" )
public class EntityTwo extends AnyClass
{
    ...
1 голос
/ 15 декабря 2015

Я столкнулся с этой проблемой при использовании Spring и без использования файла hibernate.cfg.xml.Это было решено добавлением полного имени пакета класса Model в метод setPackagesToScan класса LocalSessionFactoryBean.

1 голос
/ 14 мая 2015

У меня только что была эта проблема с сущностью a, ссылающейся на сущность b.Обе сущности были расположены в общем JAR вне веб-проекта, над которым я работал;a было объявлено в файле persistence.xml, а b - нет.Я поместил b в тег <class> в файле persistence.xml, и это сработало!

1 голос
/ 09 сентября 2011

Наконец-то получил решение от другого разработчика в команде!

Классы необходимо импортировать до создания объекта SessionFactory. Здесь импорт для нового класса отсутствовал, поэтому он был неизвестен объекту SessionFactory.

В любом случае, спасибо всем за ваши советы!

0 голосов
/ 12 мая 2018

если ваши две сущности в другом проекте, вы можете сканировать пакет KonfiguracniTemplate в другом проекте. Вы можете сделать это в весенней загрузке

@EntityScan({"com.thispackage.entity","com.KonfiguracniTemplatepackage.entity"})

0 голосов
/ 07 декабря 2014

У меня было то же исключение ... Я просто забываю добавить аннотацию (@Entity и @Table) для класса MASTER (класс с первичным ключом)

, поэтому решение заключается в двойной проверке каждой аннотации в ваших объектахЯ имею в виду не только @ManyToOne и @OneToMany, как я сделал.

0 голосов
/ 09 декабря 2013

Есть еще один шанс получить такое исключение; когда вы не упоминаете свой класс отображения в файле hibernate.cfg.xml. Как упомянуто выше.

...