Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA/Hibernate OneToMany映射,使用复合主密钥_Jpa_One To Many_Embeddable - Fatal编程技术网

JPA/Hibernate OneToMany映射,使用复合主密钥

JPA/Hibernate OneToMany映射,使用复合主密钥,jpa,one-to-many,embeddable,Jpa,One To Many,Embeddable,我目前正在努力为使用复合主键类的场景提供正确的映射注释。首先,我想用文字表达的是: 我有两个类:group和FieldAccessRule。一个组可以有多个FieldAccessRules,而FieldAccessRule只能分配一个组。建模到目前为止这不是一个问题(简化): 现在,我决定对FieldAccessRule使用复合PK,因为对于一个组和一个字段,规则应该是唯一的。看起来是这样的: @Embeddable public class FieldAccessRulePK implemen

我目前正在努力为使用复合主键类的场景提供正确的映射注释。首先,我想用文字表达的是:

我有两个类:group和FieldAccessRule。一个组可以有多个FieldAccessRules,而FieldAccessRule只能分配一个组。建模到目前为止这不是一个问题(简化):

现在,我决定对FieldAccessRule使用复合PK,因为对于一个组和一个字段,规则应该是唯一的。看起来是这样的:

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