Сущность как ключ в отношении «один к одному», возвращающем ошибку «Composite-ID» - PullRequest
0 голосов
/ 14 января 2012

У меня есть следующие 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: ошибка создания компонента с именем 'sessionFactory', определенным в ресурсе пути к классу [META-INF / spring / datasource-context.xml]: сбой вызова метода init; вложенным исключением является 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).

1 Ответ

2 голосов
/ 14 января 2012

Заменить @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;
...