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实体组合注解。每一个注解其实都不是很常使用,但是有时候使用它们却可以收到意外的效果。以上文章纯手打,如有错误请各位指出。