JPA / Hibernate OneToMany Mapping,使用复合主键

时间:2012-10-18 10:07:09

标签: jpa one-to-many embeddable

我目前正在努力使用复合主键类为方案正确的映射注释。首先,我想用语言实现的目标:

我有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;
    ...
}

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

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

并且。 FieldAccessRule需要更改为

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

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

  

在属性“fieldAccessRules”中,“映射者”值“组”无法解析为目标实体上的&gt;属性。

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

编辑: 我知道发现了,使用

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

正如预期的那样正常工作。它编译得很好,它可以很好地创建数据库,并且在加载具有预定义角色的组后,它们可以按预期使用。

然而,Eclipse仍然说

  

在属性'fieldAccessRules'中,“mapped by”值'fieldAccessRulePK.group'无法解析为目标实体上的属性。

我不确定,如果忽略错误并且“假设”每个事情都很好......(我发现了一个帖子,据说,Hibernate支持模式attr1.attr2的映射但不支持JPA -confirm。)

2 个答案:

答案 0 :(得分:7)

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

<强>原因

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

根据 Java命名变量规则,您不能使用字符点&gt;来命名fieldAccessRulePK.group。的 ''

Java命名变量规则 Reference

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

还有一件事:

请勿在{{1​​}}嵌入类中使用group个实例。有关更多参考here

尝试如下:

FieldAccessRulePK

答案 1 :(得分:3)

我通过修改父类的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;
    ...
}