gpt4 book ai didi

JPA/Hibernate OneToMany 映射,使用复合 PrimaryKey

转载 作者:行者123 更新时间:2023-12-01 16:42:05 25 4
gpt4 key购买 nike

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

我有 2 个类:group 和 FieldAccessRule。一个组可以有多个 FieldAccessRule,而一个 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,因为规则对于一个组和一个字段应该是唯一的。它看起来像这样:

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

还有ofc。 FieldAccessRule 需要更改为

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

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

In attribute 'fieldAccessRules', the "mapped by" value 'group' cannot be resolved to an >attribute on the target entity.

创建从组到主键的一部分的映射的正确方法是什么?

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

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

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

但是,Eclipse 仍然说

In attribute 'fieldAccessRules', the "mapped by" value 'fieldAccessRulePK.group' cannot be resolved to an attribute on the target entity.

我不确定,忽略错误并“假设”一切都很好是否很好...(我发现了一篇文章,其中有人说,Hibernate 支持模式 attr1.attr2 的映射,但 JPA 不支持-确认。)

最佳答案

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

原因

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

根据Java命名变量规则fieldAccessRulePK.group不能使用字符点>'.'命名

Java 命名变量规则 Reference

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

还有一件事:

请勿在 FieldAccessRulePK 可嵌入类中使用 group 实例。更多引用here .

尝试如下:

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

关于JPA/Hibernate OneToMany 映射,使用复合 PrimaryKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12952141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com