jpa实体类继承,父类中有主键子类中却显示没有主键

jpa实体类继承,父类中有主键子类中却显示没有主键

在使用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 问题就解决了。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值