在使用jpa创建实体过程中,部分公共参数一般会封装到父类中,例如:主键Id,创建时间,创建人,更新时间,更新人,数据状态等字段。为此来节省每次创建类时添加重复的字段只需要继承,一个父类就可以达到想要的效果。
创建父类时要添加@MappedSuperclass注解,通过这个注解,我们可以将该实体类当成基类实体,它不会创建数据库表,但继承它的子类实体在映射时会自动扫描该基类实体的映射属性,添加到子类实体的对应数据库表中。
使用环境:
@MappedSuperclass注解使用在父类上面,是用来标识父类的
@MappedSuperclass标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够映射在其子类对用的数据库表中
@MappedSuperclass标识得类不能再有@Entity或@Table注解
父类代码
package com.smz.smzuserjpa.entity.common;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.domain.Auditable;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Optional;
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class DefaultEntity implements Auditable<String, String, LocalDateTime>, Serializable {
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
@Column(name = "id", columnDefinition = "char(32) COMMENT '主键,id'")
private String id;
// 删除标识 (0 未删除 , 1 已删除 默认为0 不删除)
public static final int NOT_DELETED_FLAG = 0;
public static final int DELETED_FLAG = 1;
@JsonIgnore
@Column(
name = "deleted_flag",
columnDefinition = "tinyint(2) default '0' COMMENT '是否删除:0:未删除,1:删除,默认0'")
private int deletedFlag = NOT_DELETED_FLAG;
/** 创建者ID */
@CreatedBy
@Column(name = "create_user_id", columnDefinition = "varchar(50) COMMENT '创建者ID'")
private String createUserId;
/** 更新者ID */
@LastModifiedBy
@Column(name = "update_user_id", columnDefinition = "varchar(50) COMMENT '更新者ID'")
private String updateUserId;
/** 创建时间 */
@CreatedDate
@Column(name = "create_time", columnDefinition = "timestamp COMMENT '创建时间'")
private LocalDateTime createTime;
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time", columnDefinition = "timestamp COMMENT '更新时间'")
private LocalDateTime updateTime;
@Override
public Optional<String> getCreatedBy() {
return Optional.ofNullable(this.getCreateUserId());
}
@Override
public void setCreatedBy(String createdBy) {
// 如果传了createUserId,则使用;否则使用token中的userId,即这里的s
setCreateUserId(StringUtils.isNotBlank(getCreateUserId()) ? getCreateUserId() : createdBy);
}
@Override
public Optional<LocalDateTime> getCreatedDate() {
return Optional.ofNullable(this.getCreateTime());
}
//
@Override
public void setCreatedDate(LocalDateTime dateTime) {
setCreateTime(dateTime);
}
@Override
public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
setUpdateTime(lastModifiedDate);
}
@Override
public Optional<String> getLastModifiedBy() {
return Optional.ofNullable(this.getUpdateUserId());
}
@Override
public void setLastModifiedBy(String s) {
// 如果传了updateUserId,则使用;否则使用token中的userId,即这里的s
setUpdateUserId(StringUtils.isNotBlank(getUpdateUserId()) ? getUpdateUserId() : s);
}
@Override
public Optional<LocalDateTime> getLastModifiedDate() {
return Optional.ofNullable(this.getUpdateTime());
}
@Override
public boolean isNew() {
return StringUtils.isBlank(this.id);
}
}
子类代码
package com.smz.smzuserjpa.entity;
import com.smz.smzuserjpa.entity.common.DefaultEntity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Data
@Entity
@Table(name = "smz_user")
public class SmzUser extends DefaultEntity {
@Column(name = "user_name", columnDefinition = "varchar(50) COMMENT '用户名'")
private String userName;
@Column(name = "phone_number", columnDefinition = "varchar(50) COMMENT '用户手机号'")
private String phoneNumber;
@Column(name = "user_password", columnDefinition = "varchar(50) COMMENT '用户密码'")
private String userPassword;
@Column(
name = "account_status",
columnDefinition = "tinyint(2) default '0' COMMENT '账号状态:0:正常,1:禁用,默认0'")
private int account_status;
}
出现的问题
父类中有主键子类中却显示没有主键
主要原因:@id 引入的包不一致需要改成 javax.persistence.Id;下的@id 问题就解决了。