Hibernate是一个开源的Java ORM工具,用于Java应用程序和连接到数据库的JDBC之间。为了让hibernate投入工作,我们需要提供三样东西。
- Hibernate配置 - 配置缓存策略、控制台的SQL语句记录等。
- 数据库连接细节--数据库凭证,如驱动类、用户名、密码和连接URL,以连接到数据库。
- 映射细节--将实体类映射到数据库表。
我们可以通过Java配置或XML配置来配置hibernate,映射细节可以通过XML或Java注解来提供。
在这篇文章中,我们将看到最常用的hibernate注解,我们需要将Java实体类映射到数据库表中。
最常用的注解
- @Entity- 将一个类标记为实体类
- @Table- 定义了数据库表的属性
- @Column- 定义表的列的属性
- @Id- 将实体字段声明为数据库表的主键
- @GeneratedValue- 定义主键生成策略
- @Version- 控制版本划分
- @Transient- 将属性标记为瞬时属性
- @Temporal- 定义数据格式
@Entity
这个注解是使用hibernate框架时最常用和最需要的。这个注解属于 "javax.persistence "包。从hibernate 5.5.0版本开始,hibernate使用jakarta接口。所以,"@Entity "注解属于 "jakarta.persistence"。
注意:包的名称已经从javax.*.*改为jakarta.Persistence。* .* .所有的类、接口和注解的工作方式都一样。
这个注解在类的层次上被用来声明一个类是一个持久化实体。这个实体有一个属性,名字,用来定义实体的名字。默认情况下,实体的名称与类的名称相同。例子:
@Entity(name = "user")
public class User {
@Id
private Integer id;
private String name;
private String email;
//constructors, getters, and setters
}
在上面的例子中,我们在User类上声明了@Entity注解。默认情况下,该实体的名称是User。由于我们为注解中的name属性提供了一个值,所以名称从 "User "变成了 "user"。
@Table
这是一个类级注解,用于定义数据库表的名称。默认情况下,表的名字是用cameCase字母表示的类的名字。我们可以通过提供注解的name属性的值来改变表的名字。例子
@Entity(name = "user")
@Table(name = "users")
public class User {
@Id
private Integer id;
private String name;
private String email;
//constructors, getters, and setters
}
默认情况下,表的名字是user,但是,由于我们提供了@Table属性的name属性值,数据库中的表的名字将是users。
注意:表和实体的默认名称是camelCase和PascalCase版本的类名。本质上,表和实体是不一样的。
@Column
这个注解是用来定义数据库列的属性的。使用这个注解,我们可以定义列的名称、长度、nullable、可插入、可更新等属性。例如:
@Entity(name = "user")
@Table(name = "users")
public class User {
@Id
@Column(name = "user_id", unique = true)
private Integer id;
@Column(name = "fullname", length = "200")
private String name;
private String email;
//constructors, getters, and setters
}
@Id
这个注解是用来定义数据库表中实体的主键的。这是一个必要的注解,我们必须在实体类中定义,以唯一地识别记录。例子:
@Entity(name = "user")
@Table(name = "users")
public class User {
@Id
@Column(name = "user_id", unique = true)
private Integer id;
@Column(name = "fullname", length = "200")
private String name;
private String email;
//constructors, getters, and setters
}
这里,id属性被用来唯一地识别数据记录。
@GeneratedValue
这个注解用于定义主键的自动生成策略。如果我们想让主键自己生成,我们可以使用这个注解。它通常与@Id注解一起使用。
它可以使用四种生成策略。
如果我们没有明确定义策略,它默认为AUTO。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "fullname", length = "200")
private String name;
private String email;
//constructors, getters, and setters
}
GenerationType.IDENTITY就像自动增量。
@Version
这个注解用于跟踪数据库中记录的版本。版本的默认值是0,最初。此后,每当我们更新记录时,我们必须提供当前的版本。更新记录后,版本将增加一个。例子:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "fullname", length = "200")
private String name;
private String email;
@Version
private Integer version;
//constructors, getters, and setters
}
最初,当表被创建时,版本的值将是0。然后,每当我们更新该实体的任何或所有字段时,版本将增加一个。
@Transient
这个注解是用来标记类属性为瞬时的,这意味着在表中不会有特定列的名字。例子:
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "fullname", length = "200")
private String name;
private String email;
@Transient
private Integer version;
//constructors, getters, and setters
}
在上面的例子中,由于我们已经将版本成员标记为瞬时,在数据库表中只有id、fullname和email列可用。将不会有版本属性的列。
@Temporal
对于java.util.Date和java.util.Calendar类型的持久化字段或属性,必须指定该注解。它只能被指定给这些类型的字段或属性。它用于定义数据库中时间数据的精度。
它可以有三个值DATE(只有日期),TIME(只有时间),或者TIMESTAMP(日期和时间)。例子:
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "fullname", length = "200")
private String name;
private String email;
@Temporal(TemporalType.DATE)
private Date dob;
//constructors, getters, and setters
}
在上面的例子中,只有日期会被保存在数据库表中。
以上描述的是最常用的注解,我们几乎每次做持久化类都会用到。除了这些注解之外,在hibernate中还有很多其他的注解,这些注解是针对特定情况的,比如注解映射和继承映射。
- @OrderBy- 定义了记录的排序
- @Lob- 定义二进制的大对象,如图片
- @Embeddable- 标记一个类为可嵌入对象
- @Embedded- 将一个实例变量标记为嵌入式变量
- @EmbeddedId- 将一个实例变量标记为嵌入式引用,它是实体的复合键。
- @OneToOne- 定义了一对一的映射
- @OneToMany- 定义了一对多的映射
- @ManyToOne- 定义了多对一的映射
- @ManyToMany- 定义了多对多的映射
- @Inheritance- 定义了继承映射的类型
- @DiscriminatorColumn- 定义实体的鉴别器列
- @DiscriminatorValue- 定义一个实体的判别值等。
编码愉快!
继续探索