Spring Data JPA 中常用注解详解

一、java对象与数据库字段转化

@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表

@Table:设置实体类在数据库所对应的表名

@Id:标识类里所在变量为主键

@GeneratedValue:设置主键生成策略,此方式依赖于具体的数据库

@Entity
@Table(name = "login_log")
public class LoginLogDO{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String remoteAddr;
private String username;
private String mobile;

...

@Column:表示属性所对应字段名进行个性化设置

@Column注解一共有10个属性,这10个属性均为可选属性,各属性含义分别如下:

name
name属性定义了被标注字段在数据库表中所对应字段的名称;

unique
unique属性表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。

nullable
nullable属性表示该字段是否可以为null值,默认为true。

insertable
insertable属性表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。

updatable
updatable属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。

columnDefinition
columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)

table
table属性定义了包含当前字段的表名。

length
length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。

precision和scale
precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

@Temporal:

  当我们使用到java.util包中的时间日期类型,则可以使用此注释转化成java.util包中的类型。

  注入数据库的类型有三种:

TemporalType.DATE(2008-08-08)

TemporalType.TIME(20:00:00)

TemporalType.TIMESTAMP(2008-08-08 20:00:00.000000001)

@Enumerated:

使用此注解映射枚举字段,以String类型存入数据库

注入数据库的类型有两种:EnumType.ORDINAL(Interger)、EnumType.STRING(String)

@Embedded、@Embeddable:

  当一个实体类要在多个不同的实体类中进行使用,而其不需要生成数据库表

@Embeddable:注解在类上,表示此类是可以被其他类嵌套

@Embedded:注解在属性上,表示嵌套被@Embeddable注解的同类型类

@ElementCollection集合映射

@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy:

表示字段为创建时间字段(insert自动设置)、创建用户字段(insert自动设置)、最后修改时间字段(update自定设置)、最后修改用户字段(update自定设置)

例如:

在新建用户的时候,不用管用户创建的时间和用户属性修改的时间,@CreateDate和@LastModifiedDate注解会自动帮你添加上时间。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@CreatedDate
@Column(updatable = false, nullable = false)
protected LocalDateTime gmtCreate;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
protected LocalDateTime gmtModified;

这四个注解的使用需要在启动类上加上@EnableJpaAuditing注解

@SpringBootApplication
@EnableSwagger2//启动swagger2
@EnableJpaAuditing//启动@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy注解
@EntityScan(basePackages = {"com.bbd.finance.model.domain"})
@EnableJpaRepositories(basePackages = {"com.bbd.finance.model.dao"})
public class App {
    private static final Logger log = LoggerFactory.getLogger(App.class);

    public static void main(String[] args){
        SpringApplication.run(App.class);
    }
}

@MappedSuperclass

实现将实体类的多个属性分别封装到不同的非实体类中

  注解的类将不是完整的实体类,不会映射到数据库表,但其属性将映射到子类的数据库字段
  注解的类不能再标注@Entity或@Table注解,也无需实现序列化接口

注解的类继承另一个实体类 或 标注@MappedSuperclass类,他可使用@AttributeOverride 或 @AttributeOverrides注解重定义其父类属性映射到数据库表中字段。

例如:

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseDO{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @CreatedDate
    @Column(updatable = false, nullable = false)
    protected LocalDateTime gmtCreate;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @LastModifiedDate
    protected LocalDateTime gmtModified;

//此处省略get、set方法

}

登陆日志类继承BaseDo类(用户类也继承该类,这样就减少了代码的冗余)

@Entity
@Table(name = "login_log")
public class LoginLogDo extends BaseDO {

    private String remoteAddr;

    private String username;

    private String employeeNo;

    private boolean status;

    private String reason;

//此处省略get、set方法
}

 

一对一关联

@OneToOne、@JoinColumn

//企业ID
private Long companyId;

@OneToOne
@JoinColumn(name = "companyId", referencedColumnName = "id",insertable = false,updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))

private CompanyInfoDO companyInfoDO;

 

java对象与json转化(spring注解)

1.@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8"):将Date属性转换为String类型, timezone解决(相差8小时)

 

2.@JsonSerialize:作用在类或字段上,转化java对象到json格式(需自定义转化类继承JsonSerializer<T>)

class DateSerializer extends JsonSerializer<Date> {

 

    @Override

    public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider)

            throws IOException {

        SimpleDateFormat formatter = new SimpleDateFormat(BankAccount.DATE_PATTERN);

        jgen.writeString(formatter.format(value));

    }

}

3.@JsonDeserialize:作用在类或字段上,转化json格式到java对象(需自定义转化类继承JsonDeserializer<T>)

class DateDeSerializer extends JsonDeserializer<Date> {

 

    @Override

    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {

        Date date;

        try {

            date = DateUtils.parseDate(jp.getText(), BankAccount.DATE_PATTERN);

        } catch (Exception e) {

            return null;

        }

        return date;

    }

}

4.@JsonProperty:作用在属性上,把属性名称序列化为另一个名称(trueName属性序列化为name)

5.@JsonIgnoreProperties(ignoreUnknown = true):作用在类上,json序列化时将Java bean中的一些属性忽略掉可选择多个字段@JsonIgnoreProperties({“name”},{“age”})json转javabean时忽略javabean中没有的字段(如果json中字段javabean中没有会抛出异常UnrecognizedPropertyException,此时可使用该注解)

6.@JsonIgnore:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响

将时间进行时间格式的转换

@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")     出参格式转换

@DateTimeFormat(pattern = "yyyy-MM-dd")     入参格式转换

private Date testTime;

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值