Отображение Hibernate один на один с интерфейсом. Мне нужен совет - PullRequest
7 голосов
/ 09 ноября 2009

Я занимаюсь разработкой приложения, в котором все pojos представлены в виде интерфейса, но мы отображаем реальный класс реализации. Мы используем Spring и JPA annotation. Я собираюсь протестировать отношения один-к-одному, и я возникли проблемы с интерфейсом.

Причина: org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем 'sessionContainer', определенным в ресурсе пути к классу [META-INF / model-config.xml]:
Не удается разрешить ссылку на bean-компонент sessionFactory при установке аргумента конструктора; вложенным исключением является org.springframework.beans.factory.BeanCreationException:
Ошибка создания компонента с именем 'sessionFactory', определенным в ресурсе пути к классу [META-INF / model-config.xml]:
Ошибка вызова метода init; вложенным исключением является org.hibernate.AnnotationException:
@OneToOne или @ManyToOne на com.mycompany.project.subproject.model.UserAccountImpl.profile ссылается на неизвестную сущность: com.mycompany.project.

так что перед этим классом все остальные сопоставленные классы работают должным образом, поэтому я опубликую только часть файла applicationContext, который я назвал model-config.xml

<property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
        <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
        <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
    </props>
</property>
<property name="annotatedClasses">
    <list>
       ...
        <value>com.mycompany.project.subproject.model.UserProfileImpl</value>
        <value>com.mycompany.project.subproject.model.UserAccountImpl</value>
       ...
    </list>
</property>

вот два участвующих класса UserProfileImpl.java и UserAccountImpl.java

//UserAccountImpl Class
@Entity
@Table(name ="USER_ACCOUNT")
public class UserAccountImpl implements UserAccount {

  @Id @GeneratedValue
  @Column(name="USER_ACCOUNT_ID")
  private Long ID;

  ...

  @OneToOne
  @JoinColumn(name="USER_PROFILE_ID")
  private UserProfile profile;

  ...
}

//UserProfileImpl class
@Entity
@Table(name="USER_PROFILE")
public class UserProfileImpl implements UserProfile {

  @Id @GeneratedValue
  @Column(name="USER_PROFILE_ID")
  private Long ID;
  ....

  @OneToOne(mappedBy="profile")
  private UserAccount userAccount;
  ....
}

Мне все еще не очень комфортно с Hibernate, поэтому мне интересно, стоит ли мне изменить ссылку UserProfile в UserAccountImpl на UserProfileImpl. Затем снова то же самое может произойти в UserProfileImpl для userAccount ссылка, так как это двунаправленная навигация. Какой самый лучший вариант, который не нарушит согласованность структуры? Спасибо за чтение этого

Ответы [ 3 ]

3 голосов
/ 09 ноября 2009

У вас есть следующие варианты:

  1. Вы должны как-то указать Hibernate, какой класс использовать для интерфейса UserAccount. В настоящее время наиболее простым решением является использование конкретного типа вместо интерфейса в вашем UserProfileImpl.

  2. Вы можете использовать @Target, чтобы указать используемую реализацию (см. [Документы] [1]).

  3. Вы можете сопоставить поле с пользовательским UserType. Это позволяет выбрать отображение (какую реализацию использовать для интерфейса) во время выполнения, но вы должны написать код для копирования полей между вашими бизнес-объектами и БД самостоятельно (больше никакого автоматического отображения).

2 голосов
/ 09 ноября 2009

Вы можете попробовать следующее:

@OneToOne(mappedBy="profile", targetEntity=UserAccountImpl.class)
private UserAccount userAccount
0 голосов
/ 09 ноября 2009

Должен ли UserProfile быть отдельной сущностью? Вы можете смоделировать это как Компонент и объединить таблицы UserAccount и UserProfile в одну. Ваша объектная модель по-прежнему будет иметь отдельный объект UserProfile, это будет просто объект значения, принадлежащий UserAccount.

Не каждый объект должен быть реализован как сущность, и сопоставления "один к одному" на практике встречаются довольно редко ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...