前言
在我们使用JPA的过程中肯定会用到大量的注解,这里我们就将必须用到的或者可能用到的注解都来了解一下。所有注解都有很多选项,这里我们只介绍项目中用到过的或者较为常用的。
1、@Entity
说明这个class是个实体类,并使用ORM规则;即class名就是数据库表名,class字段名就是表中字段名。也可以使用name选项来映射数据库表名(这个一般不用,都是在@Table中添加)
/**
* (可选)数据库的表名,默认为实体类的名称
*/
String name() default "";
2、@Table
当实体类与其映射的数据库表名不同名时需要使用,一般都是与 @Entity 注解并列使用,置于实体类声明语句之前。
/**
* (可选)数据库的表名,默认为实体类的名称
*/
String name() default "";
3、@Id
数据库中的主键
4、@GeneratedValue
5、@Column
表示物理数据库列的特定特征
/**
* (可选)数据库中列的名称,默认为属性或字段名称。
*/
String name() default "";
/**
* (可选)数据库列是否可为空,默认为true
*/
boolean nullable() default true;
/**
* (可选) 数据库列的数据类型,默认根据字段类型创建
*/
String columnDefinition() default "";
/**
* (可选)列长度(仅适用于字符串值列),默认255
*/
int length() default 255;
6、@ManyToOne
多对一。比如有两张表,用户表和职业表,用户对于职业来说,属于ManyToOne的一个关系,即多个用户对应一个职业。
/**
* (可选)关联是否延迟加载或者立刻加载。立刻加载是立刻获取关联的实体;
延迟加载是对持久性提供程序运行时的一个提示。默认值EAGER,也就是立刻加载。
*/
FetchType fetch() default EAGER;
/**
* (可选)关联是否可选,如果设置为false,则非空关系必须始终存在;默认为true
*/
boolean optional() default true;
7、@OneToMany
一对多。比如有两张表,用户表和职业表,职业对于用户来说,属于OneToMany的一个关系,即一个职业对应多个用户。如果关系是双向的,则必须使用 mappedBy 元素来指定作为关系所有者的实体的关系字段或属性。
/** (可选)关联是否延迟加载或者立刻加载。立刻加载是立刻获取关联的实体;
延迟加载是对持久性提供程序运行时的一个提示。默认值LAZY,也就是懒加载
*/
FetchType fetch() default LAZY;
/**
* 拥有关系的字段。必需,除非关系是单向的
*/
String mappedBy() default "";
/**
* (可选)在删除一方(One)数据的同时是否删除掉多方(Many)的数据。默认为false
*/
boolean orphanRemoval() default false;
8、@JoinColumn
用来定义主键字段和外键字段的对应关系(如果要映射的字段/列本身就是主键,则可以省略该注解)
/**
* (可选)实体中外键字段的名称;如果不填写,则 name 默认值格式为“副表名_副表主键名”
*/
String name() default "";
注:
网上查资料发现,hibernate 3.5版本之后 @JoinColumn 与 @OneToMany 中的 mappingBy 是互斥的,如果同时使用就会报错:
Associations marked as mappedBy must not define database mappings like @JoinTable or @JoinColumn