创建表
//不声明entity表无法创建
@Entity
@Table(name = "表名")
@DynamicInsert
@DynamicUpdate
//解决hibernate json 延时加载,接受参数,字段无效问题
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
主键
uuid Oracle使用
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
自增 mysql使用
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "列名",unique = true,nullable = false)
不会生成数据库列
@Transient
查询默认排序
@OrderBy(value = "列名 ASC")
枚举类型(数据库存储序列,或字符)
@Enumerated(EnumType.ORDINAL)//序列自动不需要配置
@Enumerated(EnumType.STRING)//例如Sex.MAN 存储MAN
自定义数据类型
@Column(name = "列名",columnDefinition ="数据库类型")
一对一关系
单向关系
@OneToOne(cascade ={CascadeType.DETACH,CascadeType.PERSIST,CascadeType.MERGE},fetch = FetchType.LAZY)
@JoinColumn(name="外键列名")
双向关系
@OnegToOne(mappedBy = "参考映射对象",cascade = {CascadeType.DETACH,
CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
多对一关系
ManyToOne(多对一)单向:不产生中间表
@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.MERGE},
fetch = FetchType.LAZY)
@JoinColumn(name = "外键列名")
OneToMany(一对多)单向:会产生中间表
OneToMany双向使用mappedy属性不会产生中间表
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.MERGE}
,fetch = FetchType.LAZY)
@JoinTable(name = "中间表名", joinColumns = @JoinColumn(name = "当前类id"),
inverseJoinColumns = @JoinColumn(name = "集合类型id"))
多对多关系
多对多由一方维护关系即可
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.MERGE}
,fetch = FetchType.LAZY)
@JoinTable(name = "中间表名", joinColumns = @JoinColumn(name = "当前类id"),
inverseJoinColumns = @JoinColumn(name = "集合类型id"))
//Joincolums为本表映射id inverseJoinColumns为另一张表
双向关系
@ManyToMany(mappedBy = "映射集合",cascade =
{CascadeType.DETACH,CascadeType.PERSIST, CascadeType.MERGE}
, fetch = FetchType.LAZY)
映射为另一方的关系
懒加载死循环
@JsonIgnoreProperties不同于@JsonIgnore在于,你可以注明该变量中的哪个属相不被序列化。从而允许在双向访问上都不存在环或是缺失。
@JsonIgnoreProperties("另一方对象或集合名称")
CascadeType.REMOVE(级联删除操作)
Cascade remove operation,级联删除操作。删除当前实体时,与它有映射关系的实体也会跟着被删除。
CascadeType.MERGE (级联更新操作)
Cascade merge operation {级联更新(合并)操作}当Student中的数据改变,会相应地更新Course中的数据。
CascadeType.DETACH(级联脱管/游离操作)
Cascade detach operation,级联脱管/游离操作。
如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有关的外键关联。
CascadeType.REFRESH (级联刷新操作)
Cascade refresh operation,级联刷新操作。
假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时, B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存。
CascadeType.ALL
Cascade all operations,清晰明确,拥有以上所有级联操作权限。
父类
@Entity
@Table(name = "表名")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "区分子类类型(列)")
例如:@DiscriminatorColumn(name = "type") 本表会多出type列
子类
继承父类
@Entity
@DiscriminatorValue("子表名称") 注:对应 DiscriminatorColumn 列是它的值
例如:@DiscriminatorValue("test") 数据库显示为type列等于test
父类
@Entity
@Table(name = "表名")
@Inheritance(strategy = InheritanceType.JOINED)
子类
继承父类
@Entity
@Table(name="表名")