前八个详解:腾讯课堂-有道云笔记链接
1.@Entity
注解在类名上,代表这个类是实体类。被注释的类和数据库中的某个表建立一一对应的关系。
- 代表这个类是实体类,并且使用默认的orm规则(类名即表名,类属性名即表字段名)
- 如果想改变这种默认的orm规则,就要使用@Table来改变class名与表名的映射规则,@Column来改变class中字段名与db中表的字段名的映射规则。
- 仅使用 @javax.persistence.Entity 和 @javax.persistence.Id 这两个注解,就可以作为一个实体类与数据库中的表相对应。
2.@Table
@Table(name="数据库表名")
注解在类名上,代表将这个类和数据库中的某个表的名字之间建立一一对应的关系。
- 当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用。
- 注解属性说明:
属性名 | 释义 | 值 | 默认值 |
name | 指定数据库表名称 若不指定则以实体类名称作为表名 | 字符串 | “” |
schema | 指定该实体映射的schema | 字符串 | “” |
catalog | 与schema属性相同 | 字符串 | “” |
indexes | 索引 | @Index | {} |
uniqueConstraints | 唯一约束 | @UniqueConstraint | {} |
3.@Id
注解在某一属性的get方法上,代表(标记)这个字段是主键。
- 可以标记为主键的数据类型:double和float浮点类型和它们对应的封装类不能作为主键(这是因为判断是否唯一是通过equals方法来判断的,不能够准确的匹配)
分类 | 类型 |
Java基本数据类型 | byte、int、short、long、char |
Java基本数据类型对应的封装类 | Byte、Integer、Short、Long、Character |
大数值型类 | java.math.BigInteger |
字符串类型 | String |
时间日期型 | java.util.Date、java.sql.Date |
- 联合主键:标记属性的主键(一个实体中可以出现多个@Id注解,但需要@IdClass配合使用,以表示联合主键)。标记多个主键以后,需要在类上加@IdClass注解。
@Entity @IdClass(ProjectId.class)
public class Project {
@Id int departmentId;
@Id long projectId;
}
4. 主键的自增长方式指定、声明主键的自增长方式(策略)
- mysql
@GeneratedValue(strategy=GenerationType.IDENTITY) 注解在主键字段的get方法上
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
因为mysql数据库在底层就支持主键的自增长。
- oracle
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB") 注解在类名上
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ") 注解在主键字段的get方法上
/*
* 属性注解
* strategy 策略
* SEQUENCE 序列(oracle支持序列,可以利用序列进行主键的自增)
* generator 发生器
* sql_name 自定义序列名,指向@SequenceGenerator的name属性
* 通过generator制定增长策略通过哪一个序列进行增长
*/
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sql_name")
public int getId() {
return id;
}
/*
* 类名注解
* name 索引名
* sequenceName 需要对哪一个字段进行自增长
* allocationSize 分配,配置(步长),每一次增长的幅度
*/
@SequenceGenerator(name="sql_name",sequenceName="sql_name",allocationSize=1)
@Table(name="t_user")
@Entity
public class User {
//other
}
- 通用——让系统自己去判断,数据库底层支持什么策略,就用哪种方法
@GeneratedValue(strategy=GenerationType.AUTO) 注释在主键属性的get方法上,
AUTO自动判断
- 自定义自增策略
——自己定义你的增长策略,我自己有对应的类来支持我的自增长。
@GenericGenerator
/*
* @GenericGenerator 通用的生成器 进行定义,name是索引,strategy是采用的策略
* @GeneratedValue 用于指向哪一个生成器,通过那么索引
*/
@Id
@GeneratedValue(generator="hibernate-uuid2")
@GenericGenerator(name="hibernate-uuid2",strategy="uuid2")
public String getId() {
return id;
}
3.3 @GenericGenerator 自定义主键生成策略
主键生成策略和各自的具体生成器之间的关系,在org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory中指定如下: |
public DefaultIdentifierGeneratorFactory() {
this.register("uuid2", UUIDGenerator.class);
this.register("guid", GUIDGenerator.class);
this.register("uuid", UUIDHexGenerator.class);
this.register("uuid.hex", UUIDHexGenerator.class);
this.register("assigned", Assigned.class);
this.register("identity", IdentityGenerator.class);
this.register("select", SelectGenerator.class);
this.register("sequence", SequenceStyleGenerator.class);
this.register("seqhilo", SequenceHiLoGenerator.class);
this.register("increment", IncrementGenerator.class);
this.register("foreign", ForeignGenerator.class);
this.register("sequence-identity", SequenceIdentityGenerator.class);
this.register("enhanced-sequence", SequenceStyleGenerator.class);
this.register("enhanced-table", TableGenerator.class);
}
- 参考
属性名 | 释义 | 值 | 默认值 |
strategy | 主键的生成策略 | GenerationType.TABLE 通过表产生主键,框架借由表模拟序列产生主键 GenerationType.SEQUENCE 通过序列产生主键(不支持MySql) GenerationType.IDENTITY 自增长(不支持Oracle) GenerationType.AUTO 自动选择合适的策略 | GenerationType.AUTO |
generator | 自定义生成策略 | 字符串(对应@GenericGenerator注解的name属性值) | “” |
@GeneratedValue———-表示设置该主键的自增方式,其中主要有四种:AUTO(根据数据库来自动分配),IDENTITY(mysql支持),SEQUENCE(oracle支持),TABLE(这个用得很少),另外,这个注解一般与@Id一起使用
注意:在hibernate中,如果想使用自动创建表,那么就需要指定主键的生成策略,如果不指定,就会出现,操作方法成功,但是却无法达到期望效果,比如,执行save方法,save执行成功,但是数据库却没有数据插入,就是因为主键生成策略出现问题;如果想使用已经创建表的主键策略,那么就用AUTO即可。。。(这是一个非常大的坑) --------------------- 本文来自 wangchaowei_008 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/wangchaowei_008/article/details/80906551?utm_source=copy |
5.@Column
@Column(name="对应表的字段名")
注解在某一属性的get方法上,声明属性和数据表中字段的一一对应的关系。
6.@Temporal
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;//注解可以注释在属性字段上也可以注解在get方法上
指明该属性获取时间精度。
默认为TemporalType.TIMESTAMP类型。
TemporalType枚举类型定义如下:
public enum TemporalType {
DATE, //java.sql.Date
TIME, //java.sql.Time
TIMESTAMP //java.sql.Timestamp
}
java.sql.Date、java.sql.Time和java.sql.Timestamp这三种类型不同,它们表示时间的精确度不同。三者的区别如表所示。
类型 | 说明 |
java.sql.Date | 日期型,精确到年月日,例如“2008-08-08” |
java.sql.Time | 时间型,精确到时分秒,例如“20:00:00” |
java.sql.Timestamp | 时间戳,精确到纳秒,例如“2008-08-08 20:00:00.000000001” |
7.@Transient
一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问(即:不与表字段映射)。
常用于某属性仅为临时变量时。
8. @Basic
@Basic(fetch = FetchType.LAZY)
@Column(name = "CONTENT")
private String content;
表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的属性,默认即为 @Basic。
属性名 | 释义 | 值 | 默认值 |
fetch | 加载方式 | FetchType.EAGER 即时加载 FetchType.LAZY 延迟加载 | FetchType.EAGER |
strategy | 是否可为null | 布尔值 | true |
属性optional表示属性是否可为null,不能用于Java基本数据类型byte、int、short、long、boolean、char、float、double的使用。
hibernate的xml配置的默认加载方式是:懒加载;而jpa注解的默认加载方式是:立即加载。所以有时会为了提高程序的运行效率,我们会采取一些一些方法,改变加载方式就是一种。
对于一些特殊的属性,比如长文本型text、字节流型blob型的数据,在加载Entity时,这些属性对应的数据量比较大,有时创建实体时如果也加载的话,可能严重造成资源的占用。要想解决这些问题,此时就需要设置实体属性的加载方式为延迟加载(LAZY)。
9.@Lob
设置该属性是大数据类型,比如一个文章存入到数据库,就可以把该属性用这个注解进行标识
另外:
@Lob+@Basic——–设置该属性为懒加载,主要就是对于一些很大的数据量的字段内容来进行的优化,比如有一个字段该存储为5M,那其实加载这个会很花内存的,所以通过这注解就可以实现懒加载机制(一般如果某字段超过1M就应该采用这样的方式),示例如下:
|
10.@Enumerated
设置该属性是一个枚举类,下面的例子中,SexEnum是一个性别的枚举类,这样的话,我们就可以通过下面的形式将枚举类进行设置为属性了。
/*
*这个是将枚举的索引保存到数据库
*就是比如0,1,2这样的,如果就是想保存枚举类中的枚举,以字符串进行保存进数据库,那么就可以用EnumType.STRING
*/
@Enumerated(EnumType.ORDINAL)
private SexEnum gender;