java jpa注解哪个包好,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)

class DateSerializer extends JsonSerializer{

@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)

class DateDeSerializer extends JsonDeserializer{

@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;

你可能感兴趣的:(java,jpa注解哪个包好)