我目前正在努力使用复合主键类为方案正确的映射注释。首先,我想用语言实现的目标:
我有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。)
答案 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;
...
}