Подтвердить что ты не робот

Hibernate @ManyToOne ссылается на неизвестный объект

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

@OneToOne or @ManyToOne on Matchup.awayTeam references an unknown entity: Team

Упрощенный класс Matchup выглядит следующим образом:

@Entity public class Matchup implements Serializable 
{
   protected Team awayTeam;

   @ManyToOne 
   @JoinColumn(name="away_team_id")
   public Team getAwayTeam() {
      return awayTeam;
   }
}

Упрощенный класс Team выглядит следующим образом:

@Entity
public class Team implements Serializable {
    protected List<Matchup> matchups;

    @OneToMany(mappedBy="awayTeam", targetEntity = Matchup.class,
    fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    public List<Matchup> getMatchups() {
       return matchups;
    }
}

Заметки:

  • И Matchup, и Team имеют подклассы. Я не уверен, влияет ли это на ситуацию.
  • И Matchup, и Team перечислены в моем файле persistence.xml как включенные.
  • Если я добавлю аннотации @Transient к обоим методам получения, ошибка исчезнет.

Кто-нибудь может пролить свет на то, почему происходит это исключение?

4b9b3361

Ответ 1

Я выяснил проблему: я не добавлял класс Team в объект Hibernate AnnotationConfiguration. Таким образом, Hibernate не узнавал класс.

Ответ 2

Наряду с записью в файле hibernate.cfg.xml вам потребуется @Entity аннотация для ссылочного класса.

Ответ 3

Другое решение: убедитесь, что указанный класс включен в файл hibernate.cfg.xml.

Ответ 4

Я работаю в проекте с использованием Spring и Hibernate 4, и я обнаружил, что у нас нет файла hibernate.cfg.xml. Вместо этого наш beans указан в файле applicationContext.xml, который немного похож на

<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.package.Bean</value>
        </list>
    </property>
</bean>

Добавление моего bean в список решило проблему. Вы можете найти дополнительную информацию здесь.

Ответ 5

Попробуйте добавить Квалифицированное имя (ClassNAME), например:

<hibernate-configuration>
    <session-factory name="java:/hibernate/SessionFactory">
                  <mapping class="co.com.paq.ClassNAME" />
        </session-factory>
</hibernate-configuration>

В файле:

META-INF/hibernate.cfg.xml

Ответ 6

Добавьте класс в hibernate.cfg в правильном порядке. Сначала сопоставьте файл, на который будет ссылаться другой класс

Ответ 7

У меня была такая же проблема, и я боролся с ней последние пару часов. Наконец, я обнаружил, что значение в свойстве packageToscan и фактическое имя пакета не совпадают с регистром. Пакет был в верхнем регистре (DAO), а packageToscan имел значение dao. просто хотел бы добавить это в случае, если кто-то найдет его полным

Ответ 8

Если вы не используете hibernate.cfg.xml, вы можете добавить параметр targetEntity в аннотацию @ManyToOne/@OneToMany с классом, описывающим вашу сущность. Например: @ManyToOne (targetEntity = some.package.MyEntity.class).