首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由具有属性访问的外键组合的主密钥

由具有属性访问的外键组合的主密钥
EN

Stack Overflow用户
提问于 2017-02-15 16:14:31
回答 1查看 3.8K关注 0票数 0

我是JPA的新手请和我呆在一起。

显然,毫无疑问,如何以属性访问的方式从外键创建复合主键。

问题

如果使用下面示例中的属性访问类型,是否也必须为引用的FKs定义getter和setter?

我不认为是这样的,但是正式文件 of Java EE6这样做了。

用于J2EE企业JavaBeans开发人员指南的Oracle容器

复合主键类具有以下特征:

  • 这是一个POJO类。
  • 它必须是公共的,并且必须有一个公共的无参数构造函数。
  • 如果使用基于属性的访问,则主键类的属性必须是公共的或受保护的.
  • 它必须是可序列化的。
  • 它必须定义等于和hashCode方法。
  • 这些方法的值相等的语义必须与键映射到的数据库类型的数据库相等一致。

可以使复合主键类成为实体类所拥有的嵌入式类,也可以使其字段映射到实体类的多个字段或属性的非嵌入式类。在后一种情况下,复合主键类中的主键字段或属性的名称必须与实体类的名称相对应,它们的类型必须相同。

我修改了这个示例,因为我想使用FKs。

代码语言:javascript
复制
Example 7-2 Embeddable Composite Primary Key Class

@Embeddable
public class EmployeePK implements Serializable {
    private String name;
    private long id;

    public EmployeePK() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public int hashCode() {
        return (int) name.hashCode() + id;
    }

    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (!(obj instanceof EmployeePK)) return false;
        if (obj == null) return false;
        EmployeePK pk = (EmployeePK) obj;
        return pk.id == id && pk.name.equals(name);
    }
}

Example 7-3 JPA Entity With an Embedded Composite Primary Key Class

@Entity
@Access(AccessType.PROPERTY)
public class Employee implements Serializable {
    EmployeePK primaryKey;
 
    public Employee() {
    }
 
    @EmbeddedId
    public EmployeePK getPrimaryKey() {
        return primaryKey;
    }
 
    public void setPrimaryKey(EmployeePK pk) {
        primaryKey = pk;
    }
 
    @ManyToOne
    @MapsId("id")
    private classWithPKid fkobject1;

    @ManyToOne
    @MapsId("name")
    private classWithPKname fkobject2;
    ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-17 19:14:44

JPA (2.3.2) -显式访问类型

当Access(属性)应用于实体类、映射的超类或可嵌入类时,映射注释可以放在该类的属性上,而持久性提供程序运行时则通过该类定义的属性访问持久状态。所有没有使用瞬态注释进行注释的属性都是持久的。当访问(属性)被应用到这样的类时,可以有选择地指定类中的单个属性,以便进行实例变量访问。若要指定持久性提供程序运行时访问的持久性实例变量,则必须指定该实例变量为access (字段)如果在未指定Access(字段)的类定义的任何实例变量上放置映射注释,则行为是未定义的。根据这些超类的访问类型访问从超类继承的持久状态。

JPA (2.3.3) -可嵌入类访问类型

可嵌入类的访问类型由实体类、映射超类或嵌入类的访问类型确定,其中嵌入(包括作为元素集合的成员),而不依赖于包含类的访问类型是否已显式指定或默认。可以通过如上所述的access注释为该可嵌入类指定可嵌入类的不同访问类型。

当AccessType设置为实体类的属性时,提供程序将使用这些方法获取持久状态和映射数据。当类的AccessType是属性时,持久性提供程序不必查找字段上的映射注释。另外,请注意AccessType是由嵌入式类继承的,这就是为什么EmployeePK也需要定义getter/setter。根据规范中的内容,当实体类使用Access(属性)时,应该执行以下操作之一:

  1. 为FK字段定义getter/setter方法,并将映射放在getter方法上 示例: @Entity @Access(AccessType.PROPERTY)公共类雇员{私有EmployeePK primaryKey;私有ClassWithPKid fkobject1;@EmbeddedId public EmployeePK getPrimaryKey() {getPrimaryKey;} @ManyToOne @MapsId("id") public ClassWithPKid getFkobject1() { return fkobject1;}}
  2. 或者,显式地定义持久字段上的访问(字段)。 示例: @Entity @Access(AccessType.PROPERTY)公共类雇员{ EmployeePK primaryKey;@ManyToOne @MapsId("id") @Access(AccessType.FIELD)私有ClassWithPKid fkobject1;@EmbeddedId public EmployeePK getPrimaryKey() {返回primaryKey;}}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42254584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档