У меня возникла проблема, когда я хочу выполнить отношения @ManyToOne из нескольких таблиц в другую таблицу, для лучшего объяснения я добавляю изображение с моим примером ER.
Как видите, у меня есть основная таблица (КЛИЕНТЫ) с @EmbeddedId, которая имеет много связей с TABLE_1, TABLE_2 ... TABLE_N, у меня нет проблем с этими Join. Помимо этих таблиц, у меня есть еще одна таблица (TRANSLATIONS), в которой будут храниться «имена» и «описания» других таблиц, чтобы разрешить использование мультиязычности в приложении. PK состоит из общего ключа между всеми APP (столбцы server_id и client_id), автоматически сгенерированного идентификатора (translation_id) с последовательностью и кодом языка (например: EN, FR ...).
Итак, что я чтобы присоединиться к любой таблице TABLE с таблицей TRANSLATIONS можно использовать два разных объединения:
NAME_JOIN
- server_id (TABLE_N) -> server_id (TRANSLATIONS)
- client_id (TABLE_N) -> client_id (TRANSLATIONS)
- name_id (TABLE_N) -> translation_id (TRANSLATIONS)
DESC_JOIN
- server_id (TABLE_N) -> server_id (TRANSLATIONS)
- client_id (TABLE_N) -> client_id (TRANSLATIONS)
- desc_id (TABLE_N) -> translation_id (TRANSLATIONS)
Как видите, несколько таблиц объединятся с таблицей TRANSLATIONS; возможно ли это?
То, что я делаю, это отношения @OneToMany:
@Embeddable
public class Table1PK implements Serializable {
@Column(name="server_id")
private long serverId;
@Column(name="client_id")
private long clientId;
@Column(name="table_1_id")
private long table1Id;
// Getters and Setters
}
@Entity
@Table(name="table_1")
public class Table1 {
@EmbeddedId
private Table1PK pk;
@Column(name="name_id", unique=true)
private long nameId;
@Column(name="desc_id", unique=true)
private long descId;
@OneToMany(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="server_id", referencedColumnName="server_id", insertable=false, updatable=false),
@JoinColumn(name="client_id", referencedColumnName="client_id", insertable=false, updatable=false),
@JoinColumn(name="translation_id", referencedColumnName="name_id", insertable=false, updatable=false),
})
private Set<Translation> names = new HashSet<Translations>();
// Same Join for descriptions;
// Getters and Setters
}
Когда я запускаю приложение, я получаю следующую ошибку:
org.hibernate.AnnotationException: referencedColumnNames(server_id, client_id, name_id) of ...model.Translation referencing ...model.Table1 not mapped to a single property
Y попробуйте с @OneToMany и @JoinTable, и я получаю ту же ошибку.
Возможно, это невозможно, или это не связь @OneToMany, или есть другой способ сделать эти объединения.
Можно ли выполнять необходимые объединения по коду? Или мне нужно изменить таблицу БД в соответствии с моими потребностями?
Спасибо всем за помощь.