JPA——step1-总结-基本注解

前八个详解:腾讯课堂-有道云笔记链接

 

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

    自定义主键生成策略

属性名

释义

默认值

name

生成器名称

字符串(对应@GeneratedValue注解的generator属性值)

strategy

具体生成器的类名

见该表下的代码块

parameters

strategy生成器用到的参数

 

{}

    主键生成策略和各自的具体生成器之间的关系,在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 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/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就应该采用这样的方式),示例如下:

@Lob @Basic(fetch = FetchType.LAZY)
    private Byte[] file;

 

10.@Enumerated

设置该属性是一个枚举类,下面的例子中,SexEnum是一个性别的枚举类,这样的话,我们就可以通过下面的形式将枚举类进行设置为属性了。

/*
 *这个是将枚举的索引保存到数据库
 *就是比如0,1,2这样的,如果就是想保存枚举类中的枚举,以字符串进行保存进数据库,那么就可以用EnumType.STRING
 */
@Enumerated(EnumType.ORDINAL)
private SexEnum gender;

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值