jpa 实体注解

导入的包:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

1. @Entity
被Entity标注的实体类将会被JPA管理控制,在程序运行时,JPA会识别并映射到指定的数据库表
唯一参数name:指定实体类名称,默认为当前实体类的非限定名称。
若给了name属性值即@Entity(name="XXX"),则jpa在仓储层(数据层)进行自定义查询时,所查的表名应是XXX。
如:select s from XXX s

2. @Table
当你想生成的数据库表名与实体类名称不同时,使用 @Table(name="数据库表名"),与@Entity标注并列使用,置于实体
类声明语句之前

@Entity
@Table(name="t_student")
public class student{
  ...


@Table中的参数(不常用)

catalog: 用于设置表所映射到的数据库的目录
schema: 用于设置表所映射到的数据库的模式
uniqueConstraints: 设置约束条件

3. @Id

@Id 用于实体类的一个属性或者属性对应的getter方法的标注,被标注的的属性将映射为数据库主键

4.@GeneratedValue 
设置标识符的生成策略,常与@Id一起使用 
参数:strategy指定具体的生成策略 
方式一:@GeneratedValue(strategy=GenerationType.AUTO) 也是默认策略, 即写成@GeneratedValue也可; 
类似于hibernate的native策略,生成方式取决于底层的数据库。 
方式二:@GeneratedValue(strategy = GenerationType.IDENTITY)指定“自动增长”策略,适用于MySQL; 
方式三:@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “seq_tbl_person”)指定“序列”策略,常用于Oracle,其中generator表示生成器的名字。而且还要指定@SequenceGenerator(name = “seq_tbl_person”, sequenceName = “seq_tbl_person”, allocationSize = 1)注解配合使用 
其中name指定生成器的名字(与generator的值一样),sequenceName指定数据库中定义序列的名字,allocationSize指定序列每次增长1

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String id ;

5.@Basic
@Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的 getXxxx() 方法,默认即为@Basic(fetch=FetechType.EAGER)
@Basic参数:
  1. fetch 表示该属性的加载读取策略
    1.1 EAGER 主动抓取 (默认为EAGER)
    1.2 LAZY 延迟加载,只有用到该属性时才会去加载
  2. optional (默认为 true)
    表示该属性是否允许为null

6. @Column
通常置于实体的属性声明之前,可与 @Id 标注一起使用
@Column参数:
  1. name: 指定映射到数据库中的字段名
  2. unique: 是否唯一,默认为false
  3. nullable: 是否允许为null,默认为true
  5. insertable: 是否允许插入,默认为true
  6. updatetable: 是否允许更新,默认为true
  7. columnDefinition: 指定该属性映射到数据库中的实际类型,通常是自动判断。

@Data
@Entity
@Table(name="table_management_fields")
public class TableManagementFields implements Serializable{
	private static final long serialVersionUID = -201810311200L;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private String id ;
	
	@Column(name="db_name")
	private String dbName ;//字段所在库
	
	@Column(name="table_name")
	private	String tableName;//字段所在表
.......



7. @Transient
JPA会忽略该属性,不会映射到数据库中,即程序运行后数据库中将不会有该字段

8. @Temporal
Java中没有定义 Date 类型的精度,而数据库中,表示时间类型的数据有 DATE,TIME,TIMESTAMP三种精度
  - @Temporal(TemporalType.DATE) 表示映射到数据库中的时间类型为 DATE,只有日期
  - @Temporal(TemporalType.TIME) 表示映射到数据库中的时间类型为 TIME,只有时间
  - @Temporal(TemporalType.TIMESTAMP) 表示映射到数据库中的时间类型为 TIMESTAMP,日期和时间都有

9. @Embedded 和 @Embeddable
用于一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表
 

10. @JoinColumn
定义表关联的外键字段名
常用参数有:
  1. name: 指定映射到数据库中的外键的字段名
  2. unique: 是否唯一,默认为false
  3. nullable: 是否允许为null,默认为true
  4. insertable: 是否允许插入,默认为true
  5. updatetable: 是否允许更新,默认为true
  6. columnDefinition: 指定该属性映射到数据库中的实际类型,通常是自动判断。

11. @OneToOne
参数:

targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类
cascade: 级联操作策略 
CascadeType.ALL 级联所有操作
CascadeType.PERSIST 级联新增
CascadeType.MERGE 级联归并更新
CascadeType.REMOVE 级联删除
CascadeType.REFRESH 级联刷新
CascadeType.DETACH 级联分离
fetch: fetch 表示该属性的加载读取策略 (默认值为 EAGER) 
EAGER 主动抓取
LAZY 延迟加载,只有用到该属性时才会去加载
optional: 默认为true,关联字段是否为空 
如果为false,则常与@JoinColumn一起使用
mappedBy: 指定关联关系,该参数只用于关联关系被拥有方 
只用于双向关联@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中没有 
@OneToOne(mappedBy = “xxx”) 
表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方 
关系拥有方:对应拥有外键的数据库表
关系被拥有方:对应主键被子表引用为外键的数据库表
orphanRemoval:默认值为false 
判断是否自动删除与关系拥有方不存在联系的关系被拥有方(关系被拥有方的一个主键在关系拥有方中未被引用, 
当jpa执行更新操作时,是否删除数据库中此主键所对应的一条记录,若为true则删除)
 

12. @ManyToOne、@OneToMany
多对一(也可叫一对多,只是前后表颠倒一下而已),只有双向多对一时才用得到@OneToMany。多对一中多的一方必定是对应数据库中拥有外键的表,即是关系拥有方,@ManyToOne只用在多对一中代表多的一类中,因为mappedBy只用于关系被拥有方,所以@ManyToOne参数中不包含mappedBy。

@ManyToOne参数:

targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类
cascade: 级联操作策略 
CascadeType.ALL 级联所有操作
CascadeType.PERSIST 级联新增
CascadeType.MERGE 级联归并更新
CascadeType.REMOVE 级联删除
CascadeType.REFRESH 级联刷新
CascadeType.DETACH 级联分离
fetch: fetch 表示该属性的加载读取策略(@ManyToOne 的默认值是 EAGER,@OneToMany 的默认值是 LAZY) 
EAGER 主动抓取
LAZY 延迟加载,只有用到该属性时才会去加载
optional: 默认为true,关联字段是否为空 
如果为false,则常与@JoinColumn一起使用
@OneToMany 参数除上述以外还有:

mappedBy: 指定关联关系,该参数只用于关联关系被拥有方 
只用于双向关联@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中没有 
@OneToMany(mappedBy = “xxx”) 
表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方

关系拥有方:对应拥有外键的数据库表
关系被拥有方:对应主键被子表引用为外键的数据库表
orphanRemoval:默认值为false 
判断是否自动删除与关系拥有方不存在联系的关系被拥有方(关系被拥有方的一个主键在关系拥有方中未被引用, 
当jpa执行更新操作时,是否删除数据库中此主键所对应的一条记录,若为true则删除)


13. @ManyToMany
targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类
cascade: 级联操作策略 
CascadeType.ALL 级联所有操作
CascadeType.PERSIST 级联新增
CascadeType.MERGE 级联归并更新
CascadeType.REMOVE 级联删除
CascadeType.REFRESH 级联刷新
CascadeType.DETACH 级联分离
fetch: fetch 表示该属性的加载读取策略 (默认值为 LAZY) 
EAGER 主动抓取
LAZY 延迟加载,只有用到该属性时才会去加载 
mappedBy: 指定关联关系,该参数只用于关联关系被拥有方 
只用于双向关联@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中没有。 
@ManyToMany(mappedBy = “xxx”) 
表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方:
关系拥有方:对应拥有外键的数据库表
关系被拥有方:对应主键被子表引用为外键的数据库表
 

14.@OrderBy

@OneToMany(mappedBy="export",cascade=CascadeType.ALL)

@OrderBy("ORDER_NO") 按照下面集合中实体对应表中 的ORDER_NO字段asc排序 升序

private Set<ExportProduct> exportProducts; //报运下的货物 一对多

15.@MappedSuperclass 
可选 
@MappedSuperclass可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解


16.@Embedded 
@Embedded将几个字段组合成一个类,并作为整个Entity的一个属性. 
例如User包括id,name,city,street,zip属性. 
我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,name和address这三个属性. 
Address对象必须定义为@Embededable
 

17. @Enumerated
当实体类中有枚举类型的属性时,默认情况下自动生成的数据库表中对应的字段类型是枚举的索引值,是数字类型的,若希望数据库中存储的是枚举对应的String类型,在属性上加入@Enumerated(EnumType.STRING)注解即可。

@Enumerated(EnumType.STRING)
@Column(nullable = true)
private RoleEnum role;
 

猜你喜欢

转载自blog.csdn.net/qq_27886997/article/details/83587812
今日推荐