转自:https://www.zybuluo.com/zhuanxu/note/999965
1.@Entity和@Table
@Entity标注用于实体类,表明该Java类为实体类,将映射到指定的数据库表。
当实体类与其映射的数据库表明不同名时,需要使用@Table标注说明。@Table标注和@Entity标注一同使用,标注与实体类上。
@Table注解的常用属性是name,用于指明数据库的表名。
@Entity
@Table(name = "sy_user")
public class UserEntity {
}
2.@Id和@GeneratedValue
@Id注解应用于实体的属性或者属性对应的getter方法,表示该属性映射为数据库表的主键。
@GeneratedValue与@Id一起使用,表示主键的生成策略,通过strategy属性指定。
在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
- IDENTITY:采用数据库ID自增长的方式产生主键,Oracle 不支持这种方式。
- AUTO: JPA 自动选择合适的策略,是默认选项。
- SEQUENCE:通过序列产生主键,通过@SequenceGenerator标注指定序列名,MySQL 不支持这种方式。
- TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略更易于做数据库移植。
3.@Basic
@Basic表示属性到数据库表的字段的映射。一个@Entity标注的实体类中的属性 ,如果没有任何注解,默认即为@Basic
@Basic注解有两个常用属性:
- fetch: 表示实体类对应属性的读取策略,有EAGER和LAZY两种取值,分别表示主动抓取和延迟加载,默认值为EAGER。
- optional: 表示该属性是否允许为null,默认值为true。
4.@Column
当实体类的属性与其映射的数据库表的列名称不同时,可以使用@Colunm标注。该标注描述了数据库表中该字段的详细定义,包含以下属性:
- name:表示数据库表中该字段的名称,默认情形属性名称一致。
- nullable:表示该字段是否允许为null,默认为true。
- unique:表示该字段是否是唯一标识,默认为false。
- length:表示该字段的大小,仅对String类型的字段有效。
- insertable:表示在 ORM 框架执行插入操作时,该字段是否应出现 INSETRT 语句中,默认为true。
- updateable:表示在 ORM 框架执行更新操作时,该字段是否应该出现在 UPDATE 语句中,默认为true。对于一经创建就不能更改的字段,该属性非常有用,比如email属性。
- columnDefinition:表示该字段在数据库中的实际类型。通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型,但是依然有些例外:
- Date类型无法确定数据库中字段类型究竟是DATE、TIME还是TIMESTAMP
- String的默认映射类型为VARCHAR,如果希望将String类型映射到特定数据库的BLOB或TEXT字段类型,则需要进行设置
5.@Transient
@Transient表示该属性并非一个到数据库表的字段的映射,JPA 将忽略该属性。
如果一个属性并非数据库表的字段映射,就务必将其标注为@Transient,否则 JPA 默认其注解为@Basic。
6.@Temporal
在数据库中,表示时间类型的数据有 DATE,TIME,和 TIMESTAMP 三种精度 (即单纯的日期,时间,或者两者兼备)。 可使用@Temporal来设置Date类型的属性映射到对应精度的字段。
- @Temporal(TemporalType.DATE)映射为日期 // date (只有日期)
- @Temporal(TemporalType.TIME)映射为日期 // time (是有时间)
- @Temporal(TemporalType.TIMESTAMP)映射为日期 // date time (日期 + 时间)
7.@Lob
@Lob标注表示将属性映射成数据库支持的大对象类型,Clob 或者 Blog。其中:
- Clob(Character Large Ojects)类型是长字符串类型,java.sql.Clob、Character[]、char[] 和 String 将被映射为 Clob 类型。
- Blob(Binary Large Objects)类型是字节类型,java.sql.Blob、Byte[]、byte[] 和 实现了Serializable接口的类型将被映射为 Blob 类型。
因为这两种类型的数据一般占用的内存空间比较大,所以通常使用延迟加载的方式,与@Basic标注同时使用,设置加载方式为FetchType.LAZY。
一般情况下并不需要太多的设置,其默认行为足以处理大部分场景,这也是约定大于配置的原则。
可置于属性的注解都能置于对应的getter,一般情况下应该在整个项目中使用其中一种方式,而不能混用。