JPA Entity注解的一些总结
1关系维护方
一般来说,@OneToMany
中的Many
是关系维护方,它持有One
一方的主键(大部分情况下是主键)。
比如:一个分类对应多个文章,关系由文章来维护。
2 mappedBy
在 @OneToMany
和 @ManyToMany
中,一般在被维护方中使用 mappedBy
来指定维护方对应的属性。
当然这个指定也不是必须的。
3 fetch 方式
@OneToMany
和@ManyToMany
中的 Many
默认使用 fetch = FetchType.LAZY
懒加载方式,One
一方默认是 FetchType.EAGER
,
必须二次调用实体类的 get
方法才能查找到数据,或者改为 fetch = FetchType.EAGER
立即返回数据。
或者直接加 @JsonIgnore
注解忽略。
当然,@OneToOne
默认也是FetchType.EAGER
方式。
4 optinal选项
optional
表示关联实体是否能够为 null
,默认是 true
,可以为null
。
但是如果MySQL中的字段设置为 not null
,那么保存时会提示错误。
解决方法是有三种:
- 数据库中设置字段属性可以为
null
- 实体属性中设置初始值,如:
private List<blog> = new ArrayList<>();
- 或者在service层中处理
null
值。
5 日期时间
关于日期时间的字段,在MySQL中我喜欢用 Datetime
格式,对应JPA实体就是Date
。
对于创建日期时间,数据库中一般设置为:not null default CURRENT_TIMESTAMP
对于更新日期时间,数据库中一般设置为:not null default CURREN_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
这样在保存时会提示数据库异常,可以加上:
@Column(insertable = false, updatable = false)
不用jpa更新,让MySQL操作。
一般来说,输出的格式也不是常用的格式,可以用:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
输出类似:2019-01-01 00:00:01
的格式。
5 cascade级联
cascade
指的都是写入时的级联操作方式,默认情况下都是非级联写的。