JPA @OneToMany отношения для не первичного ключа с @EmbeddedId? - PullRequest
0 голосов
/ 25 апреля 2020

У меня возникла проблема, когда я хочу выполнить отношения @ManyToOne из нескольких таблиц в другую таблицу, для лучшего объяснения я добавляю изображение с моим примером ER.

enter image description here

Как видите, у меня есть основная таблица (КЛИЕНТЫ) с @EmbeddedId, которая имеет много связей с TABLE_1, TABLE_2 ... TABLE_N, у меня нет проблем с этими Join. Помимо этих таблиц, у меня есть еще одна таблица (TRANSLATIONS), в которой будут храниться «имена» и «описания» других таблиц, чтобы разрешить использование мультиязычности в приложении. PK состоит из общего ключа между всеми APP (столбцы server_id и client_id), автоматически сгенерированного идентификатора (translation_id) с последовательностью и кодом языка (например: EN, FR ...).

Итак, что я чтобы присоединиться к любой таблице TABLE с таблицей TRANSLATIONS можно использовать два разных объединения:

  1. NAME_JOIN

    • server_id (TABLE_N) -> server_id (TRANSLATIONS)
    • client_id (TABLE_N) -> client_id (TRANSLATIONS)
    • name_id (TABLE_N) -> translation_id (TRANSLATIONS)
  2. 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, или есть другой способ сделать эти объединения.

Можно ли выполнять необходимые объединения по коду? Или мне нужно изменить таблицу БД в соответствии с моими потребностями?

Спасибо всем за помощь.

...