Jpa实体注解详细说明之组合注解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15127715/article/details/82731328

Jpa实体注解详细说明之组合注解

有些对象本身不能存在,只能嵌入其他实体中。使用组合注释指定嵌入的对象,并覆盖它们在拥有实体表中的映射方式。

1.@AssociationOverride和@AssociationOverrides
默认情况下,TopLink JPA自动假定子类继承了超类中定义的持久属性及其关联映射,使用 @AssociationOverride注释来定制 @OneToOne或 @ManyToOne映射从继承 @MappedSuperclass或在 @Embeddable中改变 @JoinColumn与现有的字段或属性相关联。如果要进行多项 @AssociationOverride更改,则必须使用 @AssociationOverrides。简而言之,这两个注解的主要作用就是修改关联外键为自定义名称。

@AssociationOverride属性:
这里写图片描述

例子:覆盖映射的超类定义的关系的映射
/**
 * 
 * 如果使用@AssociationOverride PartTimeEmployee1表将Address映射到列名为ADDR_ID上  
 * 如果不使用,则PartTimeEmployee1表将Address映射到列名为Address_ID列上
 */
@Entity
@AssociationOverride(name="address", joinColumns=@JoinColumn(name="ADDR_ID"))
public class PartTimeEmployee1  extends Employee{
    @Column(name="WAGE")
    protected Float hourlyWage;
}

@AssociationOverrides属性:
这里写图片描述
用法:

/**
 * @AssociationOverrides 使用此此注解指定多个关联覆盖
 * @author chenyong
 * @projectName jpa-annotation
 * @typeName PartTimeEmployee1
 * @time 2018年9月17日 上午1:19:57
 */
@Entity
@AssociationOverrides({
    @AssociationOverride(name="address", joinColumns=@JoinColumn(name="ADDR_ID")),
    @AssociationOverride(name="healthPlan", joinColumns=@JoinColumn(name="PLAN_ID"))
})
public class PartTimeEmployee2  extends Employee{
    @ManyToOne
    protected HealthPlan healthPlan;
}

3.@AttributeOverride和@AttributeOverrides
默认情况下,TopLink JPA自动假定子类继承了映射超类中定义的持久属性及其基本映射。使用 @AttributeOverride注释自定义从@MappedSuperclass或 @Embeddable继承的基本映射, 以更改与字段或属性关联的 @Column。如果要进行多项 @AttributeOverride更改,则必须使用 @AttributeOverrides。简而言之:这两个注解就是修改相应数据表字段名称为自定义名称。
.@AttributeOverride属性:
这里写图片描述
@AttributeOverride用法实例:

  @MappedSuperclass
    public class Employee2 {
        @Id
        protected Integer id;
    }

/**
 * 
 * @AttributeOverride使用 
 * @author chenyong
 * @projectName jpa-annotation
 * @typeName PartTimeEmployee3
 * @time 2018年9月17日 上午2:23:07
 */
@Entity
@AttributeOverride(name="id", column=@Column(name="PTEMP_ID"))
public class PartTimeEmployee3  extends Employee2{

} 

@AttributeOverrides属性:
这里写图片描述
@AttributeOverrides用法实例:

/**
 * 
 * @AttributeOverrides用法
 * @author chenyong
 * @projectName jpa-annotation
 * @typeName PartTimeEmployee4
 * @time 2018年9月17日 上午2:27:05
 */
@Entity
@AttributeOverrides({
    @AttributeOverride(name="id", column=@Column(name="PTEMP_ID")),
    @AttributeOverride(name="hourlyWage", column=@Column(name="WAGE"))})
public class PartTimeEmployee4  extends Employee2{
    protected Float hourlyWage;
}

5@Embeddable和 .@Embedded
默认情况下,JPA将每个实体都持久保存到自己的数据库表中,但有时一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表,这是就可以使用这两个属性了。使用 @Embeddable批注指定一个类,其实例存储为拥有实体的内在部分并共享实体的标识。嵌入对象的每个持久属性或字段都映射到实体的数据库表。简而言之:就是将@Embeddable类的属性映射到嵌入实体中.
@Embeddable 无属性
@Embeddable用法实例

/**
 * @Embeddable注解使用
 * @author chenyong
 * @projectName jpa-annotation
 * @typeName Address
 * @time 2018年9月17日 上午2:52:27
 */
@Embeddable
@Data
public class Address {
    private String country;
    private String province;
}
/**
 * Person表中将生成id,country,province三个字段
 * @author chenyong
 * @projectName jpa-annotation
 * @typeName Person
 * @time 2018年9月17日 上午2:52:22
 */
@Entity
@Data
public class Person {
    @Id
    private Integer id;

    private Address address;
}

@Embedded 无属性
@Embedded 用法实例

/**
 * Person表中将生成id,country,province三个字段
 * 
 * @author chenyong
 * @projectName jpa-annotation
 * @typeName Person
 * @time 2018年9月17日 上午2:52:22
 */
@Entity
@Data
public class Person1 {

    @Id
    private Integer id;
    @Embedded
    private Address address;
}

所有实例代码均已经上传至github服务器https://github.com/chenyong88/jpa-annotation.git中,下载安装运行即可看到每个注解产生的效果。
总结:以上6个注解就是Jpa实体组合注解。每一个注解其实都不是很常使用,但是有时候使用它们却可以收到意外的效果。以上文章纯手打,如有错误请各位指出。

展开阅读全文

没有更多推荐了,返回首页