Есть таблица пользователей
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, а с другой составной первичный ключ не подходит для связки с таблицей юзеров.
Как можно разрешить ситуацию?