spring boot hibernate常用注解

hibernate常用注解

表注


 创建表

//不声明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,清晰明确,拥有以上所有级联操作权限。


子类父类 单表配置 single table

父类

@Entity
@Table(name = "表名")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "区分子类类型(列)")

 例如:@DiscriminatorColumn(name = "type") 本表会多出type列

子类

  继承父类 

@Entity
@DiscriminatorValue("子表名称")  注:对应 DiscriminatorColumn 列是它的值

  例如:@DiscriminatorValue("test") 数据库显示为type列等于test


子类父类 多表配置 joined  

 父类

@Entity
@Table(name = "表名")
@Inheritance(strategy = InheritanceType.JOINED)

子类

  继承父类 

@Entity
@Table(name="表名")

 

 

 

你可能感兴趣的:(JPA)