JPA/Hibernate OneToMany映射,使用复合主密钥
我目前正在努力为使用复合主键类的场景提供正确的映射注释。首先,我想用文字表达的是: 我有两个类:group和FieldAccessRule。一个组可以有多个FieldAccessRules,而FieldAccessRule只能分配一个组。建模到目前为止这不是一个问题(简化): 现在,我决定对FieldAccessRule使用复合PK,因为对于一个组和一个字段,规则应该是唯一的。看起来是这样的:JPA/Hibernate OneToMany映射,使用复合主密钥,jpa,one-to-many,embeddable,Jpa,One To Many,Embeddable,我目前正在努力为使用复合主键类的场景提供正确的映射注释。首先,我想用文字表达的是: 我有两个类:group和FieldAccessRule。一个组可以有多个FieldAccessRules,而FieldAccessRule只能分配一个组。建模到目前为止这不是一个问题(简化): 现在,我决定对FieldAccessRule使用复合PK,因为对于一个组和一个字段,规则应该是唯一的。看起来是这样的: @Embeddable public class FieldAccessRulePK implemen
@Embeddable
public class FieldAccessRulePK implements Serializable{
private String fieldKey;
private Group group;
...
}
和ofc。FieldAccessRule需要更改为
public class FieldAccessRule {
...
@EmbeddedId
private FieldAccessRulePK fieldAccessRulePK;
...
}
现在如何为组的FieldAccessRuleSet创建正确的映射?
这样做,我得到:
在属性“fieldAccessRules”中,“mapped by”值“group”无法解析为目标实体上的>属性
创建从组到PrimaryKey一部分的映射的正确方法是什么
编辑:
我知道你发现了,使用
public class Group{
...
@OneToMany(mappedBy = "fieldAccessRolePK.group")
private Set<FieldAccessRule> fieldAccessRules;
...
}
公共类组{
...
@OneToMany(mappedBy=“fieldAccessRolePK.group”)
私有集合规则;
...
}
正如预期的那样工作。它编译的很好,它创建的DB很好,在加载一个具有预定义角色的组后,它们可以按预期使用
然而,Eclipse仍然表示
在属性“fieldAccessRules”中,“mapped by”值“fieldAccessRulePK.group”无法解析为目标实体上的属性
我不确定,如果忽略错误并“假设”一切都好的话。。。(我发现一篇帖子,上面说Hibernate支持模式attr1.attr2的映射,但JPA不支持。)在您的代码中,
EntityManager
无法解析mappedBy
属性fieldAccessRulePK.group
原因
EntityManager
假设FieldAccessRule
实体在FieldInjection
过程中有一个属性名为fieldAccessRulePK.group
根据Java命名变量规则,您不能使用点>字符命名fieldAccessRulePK.group
。
Java命名变量规则
所有变量名都必须以字母表中的字母、下划线(u)或美元符号($)开头。其余字符可以是前面提到的任何字符加上数字0-9。
惯例是总是使用字母表中的一个字母。不鼓励使用美元符号和下划线
还有一件事:
不要在FieldAccessRulePK
可嵌入类中使用group
实例。以供更多参考
请尝试以下操作:
@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;
}
@可嵌入
公共类FieldAccessRulePK实现可序列化{
@列(name=“FIELD\u KEY”)
私有字符串字段密钥;
@列(name=“GROUP\u ID”)
私有字符串groupId;
}
公共类字段访问规则{
@嵌入ID
私有FieldAccessRulePK id;
@许多酮
@JoinColumn(name=“GROUP\u ID”,referencedColumnName=“ID”)
私人集团;
}
公共课组{
@OneToMany(mappedBy=“集团”)
私有集合规则;
}
我通过修改父类的mappedBy
属性(使用点符号)修复了类似的问题
referencedColumnName=“ID”
来自哪里?为什么“ID”
?@Snekse,您的集团实体必须具有ID
主键。
public class Group{
...
@OneToMany(mappedBy = "fieldAccessRolePK.group")
private Set<FieldAccessRule> fieldAccessRules;
...
}
@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;
}
public class Group{
...
@OneToMany(mappedBy = "fieldAccessRulePK.group")
private Set<FieldAccessRule> fieldAccessRules;
...
}
@Embeddable
public class FieldAccessRulePK implements Serializable{
private String fieldKey;
@ManyToOne
@JoinColumn(name = "group_id")
private Group group;
...
}