JPA/Hibernate OneToMany Mapping,使用复合PrimaryKey

dog*_*ose 12 jpa one-to-many embeddable

我目前正在努力使用复合主键类的方案正确的映射注释.首先,我想用文字来实现:

我有2个类:group和FieldAccessRule.组可以有多个FieldAccessRules,而FieldAccessRule只有一个组分配.到目前为止,修改这个问题不是一个问题(简化):

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

并为FieldAccessRule:

public class FieldAccessRule {
    ...
    @ManyToOne
    @JoinColumn(name = "group_id")
    private Group group;
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,我决定使用复合PK作为FieldAccessRule,因为规则对于ONE Group和ONE Field应该是唯一的.它看起来像这样:

@Embeddable
public class FieldAccessRulePK implements Serializable{
    private String fieldKey;
    private Group group;
    ...
}
Run Code Online (Sandbox Code Playgroud)

和ofc.FieldAccessRule需要更改为

public class FieldAccessRule {
    ...
    @EmbeddedId
    private FieldAccessRulePK fieldAccessRulePK;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如何为Group的FieldAccessRuleSet创建正确的映射?这样做,我得到:

在属性"fieldAccessRules"中,"映射者"值"组"无法解析为目标实体上的>属性.

什么是创建从Group到PrimaryKey的PART的映射的正确方法?

编辑:我知道发现,使用

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

完全按预期工作.它编译得很好,它可以很好地创建数据库,并且在加载具有预定义角色的组之后,它们可以按预期使用.

但是,Eclipse仍然说

在属性"fieldAccessRules"中,"映射的"值"fieldAccessRulePK.group"无法解析为目标实体上的属性.

我不确定,如果忽略错误并且"假设"每一件事情都很好......(我发现一个帖子,据说已经说过,Hibernate支持模式attr1.attr2的映射但不支持JPA确认. )

Zaw*_* oo 7

在您的代码中,EntityManager无法解析mappedBy属性fieldAccessRulePK.group.

原因

EntityManager假设FieldAccessRule实体在期间具有fieldAccessRulePK.group的属性名称 FieldInjection.

根据Java命名变量规则,您不能fieldAccessRulePK.group使用字符点''命名.

Java命名变量规则 参考

所有变量名称必须以字母,下划线(_)或美元符号($)开头.其余的字符可以是前面提到的任何字符加上数字0-9.惯例是始终使用字母表中的字母.不鼓励美元符号和下划线.

还有一件事:

不要groupFieldAccessRulePK嵌入类中使用实例.有关此处的更多参考.

请尝试以下方式:

@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;
}
Run Code Online (Sandbox Code Playgroud)