13

我目前正在为使用复合主键类的场景使用正确的映射注释。首先,我想用文字实现什么:

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

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

和ofc。FieldAccessRule 需要更改为

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

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

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

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

编辑:我知道发现,使用

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

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

但是,Eclipse 仍然说

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

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

4

2 回答 2

7

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

原因

EntityManager假设FieldAccessRule实体 在. _FieldInjection

根据Java Naming Variables Rule,您不能fieldAccessRulePK.group使用字符 dot > '.'来命名。

Java 命名变量规则 参考

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

还有一件事:

不要在可嵌入类中使用group实例。FieldAccessRulePK更多参考在这里

尝试如下:

@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;
}
于 2012-10-19T07:54:42.207 回答
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;
    ...
}
于 2013-05-28T14:39:23.413 回答