Вопрос по jpa, embeddable, one-to-many – Отображение JPA / Hibernate OneToMany с использованием составного PrimaryKey

12

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

У меня есть 2 класса: группа и FieldAccessRule. Группа может иметь много FieldAccessRules, в то время как FieldAccessRule назначена только ОДНА группа. Модификация это пока не проблема (упрощенно):

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

и для FieldAccessRule:

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

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

@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 fieldAccessRules;
    ... 
}

точно работает, как ожидалось. Он прекрасно компилируется, создает базу данных нормально, и после загрузки группы с предопределенными ролями они становятся доступными, как и ожидалось.

Тем не менее, Eclipse все еще говорит

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

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

Ваш Ответ

2   ответа
7

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

причина

EntityManager Предположим, чтоFieldAccessRule Сущность имеет имя атрибута сfieldAccessRulePK.group в течение .FieldInjection

В соответствии сПравило именования переменных Java, вы не можете назватьfieldAccessRulePK.group используя символы точка> ''

Правило именования переменных 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 fieldAccessRules;
}
ГдеreferencedColumnName = "ID" приходящий из? Зачем ?"ID" Snekse
@Snekse, ваша группа должна иметьid первичный ключ. Zaw Than oo
3

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

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

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

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

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

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