1 @Setter 2 @Getter 3 @MappedSuperclass 4 public class CreateTimeAndUpdateTime implements Serializable { 5 6 @Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP",insertable = false,updatable = false) 7 private Timestamp createTime; 8 9 @Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP",insertable = false,updatable = false) 10 private Timestamp updateTime; 11 12 }
@Entity @Data @NoArgsConstructor public class TblTest extends CreateTimeAndUpdateTime { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(length = 32) private String name; }
【创建的表】 CREATE TABLE tbl_test ( id int(11) NOT NULL, create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, name varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) )
说明:
@javax.persistence.MappedSuperclass注解用在父类上面的,用来标识父类。
基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中
例如,数据库表中都需要id字段,id是这些映射实体类的通用的属性,交给jpa统一生成主键id编号,那么使用一个父类来封装这些通用属性,并用@MappedSuperclas标识。
注意:
1.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
2.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解,也无需实现序列化接口。
上面例子中把 createTime 和 updateTime 抽出来了,也可以同时把 Id 抽出来,实现代码复用