JPA 自动建表(5)- 抽取 createTime 和 updateTime 实现代码复用, 关键注解:@MappedSuperclass

 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 抽出来,实现代码复用

上一篇:MP(MyBatis-Plus)实现乐观锁更新功能


下一篇:自动填充封装