@MappedSuperclass
这个注解表示在父类上面的,用来标识父类。
基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。例如,数据库表中都需要id来表示编号,id是这些映射实体类的通用的属性,交给jpa统一生成主键id编号,那么使用一个父类来封装这些通用属性,并用@MappedSuperclas标识。
注意:
1.标注为@MappedSuperclass的类将不是一个完整的实体类,它将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
2.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。
@Id是必须的,对应表的主键.
@GeneratedValue表示主键的生成方式,多数都是使用AUTO
把主键生成策略交给持久化引擎(persistence engine),持久化引擎会根据数据库在三种主键生成策略中选择其中一种。此种主键生成策略比较常用,由于JPA默认的生成策略就是GenerationType.AUTO,所以使用此种策略时.可以显式的指定@GeneratedValue(strategy = GenerationType.AUTO)也可以直接@GeneratedValue
@MappedSuperclass //它不会保存到数据库
public class BaseDomain {
@Id//对应表的主键
@GeneratedValue
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@Entity表明这是一个实体类,表示一个由jpa管理的持久对象,对应数据库的一个表,要与数据库做orm映射,默认表的名字就是类名,表中的字段就是类中的属性。它的定义如下:其中name属性表示用JPQL语句时写的表的名字,如果没有在@Table注解中指定表名,这个名字也将作为表名映射到数据库。
@Table :对应的数据表名,name: 用来指定要映射的表名。
当实体类与其映射的数据库表名不同名时需要使用 @Table注解说明
//产品表
@Entity//表示一个由jpa管理的持久对象,对应数据库的一个表
@Table(name = "product")//name: 用来指定要映射的表名
public class Product extends BaseDomain{
private String name; //产品名称
private String color; //产品颜色
private String pic; //大图片
private String smallPic;//小图片
private BigDecimal costPrice;//成本价
private BigDecimal salePrice;//销售价
}