@p-oleg

Как сделать @OneToMany на таблицу, в которой нет первичного ключа, но есть @EmbeddedId?

Есть таблица пользователей employees:
id (первичный ключ) | имя | фамилия
1 | Вася | Иванов
2 | Ваня | Петров

Есть таблица с атрибутами для пользователей employees_attr:
id (из employees) | Attr Name | Attr Value
1 | attr name 1 | attr value 1
1 | attr name 2 | attr value 2
2 | attr name 1 | attr value 1
2 | attr name 2 | attr value 2
В этой таблице нет первичного ключа (не я ее автор), но есть уникальный ключ id - attr_name

Я хочу получить в энтити для юзера список его атрибутов.
Делаю энтити для employees:

@Table(name = "employees")
public class User {
    @Id
    @Column(name = "id_empl")
    protected Integer id_empl;

    @NotBlank
    @Column(name = "name_employee")
    private String name;
...
   // Так как в employees_attr нет первичного ключа, а JPA требует его, то пришлось сделать @Embeddable
    @OneToMany(mappedBy = "userAttrPK")
    private List<UserAttr> userAttrList;
...}


@Embeddable
public class UserAttrPK implements Serializable {
    @Column(name = "id_empl")
    private int id_empl;

    @NotBlank
    @Column(name = "attr_name")
    private String attrName;
}


@Table(name = "employees_attr")
public class UserAttr {
    @EmbeddedId
    UserAttrPK userAttrPK;

    @NotBlank
    @Column(name = "attr_value")
    private String attrValue;
}


При таком раскладе получаю ошибку:
Caused by: org.hibernate.MappingException: Foreign key (FKelqockn69dnn2u8v0kib2m8ik:employees_attr [attr_name,id_empl])) must have same number of columns as the referenced primary key (employees [id_empl])

Тут понятно что он хочет, но структура таблиц такая вот.

Если в юзере написать так:
@OneToMany(mappedBy = "id_empl", fetch = FetchType.EAGER)
    private List<UserAttr> userAttrList;

То получим ошибку:
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: ru.....model.UserAttr.id_empl in ru.....dbmaster2.model.User.userAttrList

То есть с одной стороны, мне в таблице аттрибутов нужно сделать первичный ключ, т.к. этого требует JPA, а с другой составной первичный ключ не подходит для связки с таблицей юзеров.
Как можно разрешить ситуацию?
  • Вопрос задан
  • 675 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы