Подтвердить что ты не робот

JPA/Hibernate OneToMany Mapping, используя составной PrimaryKey

В настоящее время я борюсь с правильными аннотациями сопоставления для сценария, используя составной класс первичных ключей. Во-первых, чего я пытаюсь достичь словами:

У меня есть 2 класса: group и FieldAccessRule. Группа может иметь много полей FieldAccessRules, в то время как FieldAccessRule имеет только одну группу. Модирование этого пока не является проблемой (упрощено):

public class Group{
    ...
    @OneToMany(mappedBy = "group")
    private Set<FieldAccessRule> fieldAccessRules;
    ... 
}

и для параметра FieldAccessRule:

public class FieldAccessRule {
    ...
    @ManyToOne
    @JoinColumn(name = "group_id")
    private Group group;
    ...
}

Теперь я решил использовать Composite PK для FieldAccessRule, потому что правило должно быть уникальным для ONE Group и ONE Field. Это выглядит так:

@Embeddable
public class FieldAccessRulePK implements Serializable{
    private String fieldKey;
    private Group group;
    ...
}

И из. для параметра FieldAccessRule необходимо изменить значение

public class FieldAccessRule {
    ...
    @EmbeddedId
    private FieldAccessRulePK fieldAccessRulePK;
    ...
}

Как создать правильное сопоставление для FieldAccessRuleSet группы сейчас? Делая это, я получаю:

В атрибуте 'fieldAccessRules', "сопоставленная по" группе "значение" не может быть разрешена к атрибуту > на целевом объекте.

Каков правильный способ создания сопоставления из группы в ЧАСТИ PrimaryKey?

Изменить: Я знаю, что, используя

public class Group{
    ...
    @OneToMany(mappedBy = "fieldAccessRolePK.group")
    private Set<FieldAccessRule> fieldAccessRules;
    ... 
}

ТОЧНО работает, как ожидалось. Он компилируется отлично, он создает БД прекрасно и после загрузки группы с предопределенными Ролями они доступны, как ожидалось.

Однако Eclipse все еще говорит

В атрибуте 'fieldAccessRules', "сопоставленное" значением 'fieldAccessRulePK.group' не может быть разрешено к атрибуту на целевом объекте.

Я не уверен, если хорошо игнорировать ошибку и "предполагать" все отлично... (я нашел сообщение, в котором было сказано, что сопоставление шаблона attr1.attr2 поддерживается Hibernate, но не JPA -confirm.)

4b9b3361

Ответ 1

В вашем коде EntityManager не удается разрешить атрибут mappedBy fieldAccessRulePK.group.

Причина

EntityManager предположим, что объект FieldAccessRule имеет имя атрибута с fieldAccessRulePK.group во время FieldInjection.

В соответствии с Правило имен именования Java вы не можете называть fieldAccessRulePK.group с помощью символов dot > '.'

Переменные именования Java Правила Ссылка

Все имена переменных должны начинаться с буквы алфавита, символа подчеркивания (_) или знака доллара ($). Остальные символы могут быть любыми из ранее упомянутых плюс цифры 0-9. Соглашение состоит в том, чтобы всегда использовать букву алфавита. Знак доллара и подчеркивание не приветствуются.

Еще одна вещь:

Не используйте экземпляр group в своем встраиваемом классе FieldAccessRulePK. Для дополнительной справки здесь.

Попробуйте выполнить следующее:

@Embeddable
public class FieldAccessRulePK implements Serializable{
    @Column(name = "FIELD_KEY")
    private String fieldKey;
    @Column(name = "GROUP_ID")
    private String groupId;
}

public class FieldAccessRule {
    @EmbeddedId
    private FieldAccessRulePK id;

    @ManyToOne
    @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID")
    private Group group;
}


public class Group{
    @OneToMany(mappedBy = "group")
    private Set<FieldAccessRule> fieldAccessRules;
}

Ответ 2

Я исправил аналогичную проблему, изменив атрибут mappedBy родительского класса (используя пунктирную нотацию)

public class Group{
    ...
    @OneToMany(mappedBy = "fieldAccessRulePK.group")
    private Set<FieldAccessRule> fieldAccessRules;
    ... 
}

и сохраняя аннотации в классе PK:

@Embeddable
public class FieldAccessRulePK implements Serializable{
    private String fieldKey;

    @ManyToOne
    @JoinColumn(name = "group_id")
    private Group group;
    ...
}