Сущность как ключ в отношении один к одному, возвращая ошибку Composite-ID

У меня есть 2 следующих объекта:

   @Entity(name = "Employee")
   @Table(name = "EMPLOYEE")
   public class Employee implements Serializable {
      @Id
      @Column(name = "EMP_ID", insertable = true, updatable = false, nullable = false)
      private int id;

и

@Entity(name = "Draw")
@Table(name = "DRAW")

public class Draw extends AuditableEntity {
    @Id
    @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "EMP_ID", referencedColumnName = "EMP_ID")
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
    private Employee employee = null;

Скажем так, они хотят, чтобы это было смоделировано. Как указано, это отношение OneToOne. Однако когда я иду на тест, я получаю следующую ошибку:

вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'sessionFactory', определенным в ресурсе пути к классу [META-INF / spring / datasource-context.xml]: не удалось вызвать метод инициализации; вложенное исключение - org.hibernate.MappingException: класс составного идентификатора должен реализовывать Serializable: com.myprojects.tet.data.entity.Draw

Почему ключ employee в Draw интерпретируется как составной идентификатор? Также как мне исправить эту ошибку. Я прочитал, что указанный объект должен быть сериализуемым, но также необходимо реализовать методы equals и hashCode (которые я еще не реализовал). Должна ли реализация этих двух исправлений исправить эту ошибку?

Редактирование для ясности:

У меня есть две смоделированные таблицы: EMPLOYEE и DRAW:

EMPLOYEE содержит: целое число emp_id и множество других столбцов.

DRAW имеет: целое emp_id, целое totalPoints.

Таблица рисования будет заполняться и очищаться каждый раз, поэтому столбец totalPoint не может находиться в таблице EMPLOYEE. Я не уверен, верны ли отношения между объектами (т.е. сущность employee в качестве идентификатора для draw).


person Nimchip    schedule 13.01.2012    source источник


Ответы (1)


Замените @JoinColumn на @PrimaryKeyJoinColumn:

@Id
@Column(name = "EMP_ID")
private int id;

@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@PrimaryKeyJoinColumn(name = "EMP_ID", referencedColumnName = "EMP_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.MERGE})
private Employee employee;
person Tomasz Nurkiewicz    schedule 13.01.2012
comment
@Nimchip: посмотрите здесь, похоже, аналогичная проблема. - person Tomasz Nurkiewicz; 17.01.2012
comment
Привет, Томаш, похоже, это одно и то же. Если я правильно понимаю, это разные подходы (JPA и книжный), правильно ли это предположение? - person Nimchip; 17.01.2012
comment
@Nimchip: если вы обратитесь к ответу, упомянутому мной выше, они предоставляют решение с использованием аннотации, специфичной для Hibernate. - person Tomasz Nurkiewicz; 17.01.2012
comment
Спасибо, я думаю, что это исправило. - person Nimchip; 17.01.2012