在 Hibernate 中,使用注解(Annotations)是一种非常常见的方法来定义实体类与数据库表之间的映射关系。这里有一些常用的 Hibernate/JPA 注解以及它们的作用:
1. 实体声明
- @Entity:标记一个类作为实体,可以映射到数据库表中。
- @Table:指定实体映射到的具体表名以及其他表属性。
2. 属性映射
- @Id:标记一个属性作为主键。
- @GeneratedValue:指定主键的生成策略。
- @Column:指定列的属性,如列名、长度等。
- @Temporal:指定日期/时间类型的映射方式。
- @Lob:指定大对象类型(如 BLOB 或 CLOB)。
- @Enumerated:指定枚举类型的映射方式。
3. 关系映射
- @OneToOne:定义一对一的关系。
- @ManyToOne:定义多对一的关系。
- @OneToMany:定义一对多的关系。
- @ManyToMany:定义多对多的关系。
- @JoinColumn:定义连接列的属性。
- @JoinTable:定义连接表的属性。
4. 继承映射
- @Inheritance:定义继承策略。
- @DiscriminatorColumn:定义区分器列。
- @DiscriminatorValue:定义区分器列的值。
5. 其他映射
- @Embedded:定义嵌入式对象。
- @EmbeddedId:定义复合主键。
- @Formula:定义基于 SQL 表达式的计算列。
示例
下面是一个简单的示例,展示如何使用注解定义一个实体类及其关系:
import jakarta.persistence.*;
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
@Entity
@Table(name = "departments")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "department_name")
private String name;
// Getters and Setters
}
在这个示例中:
Employee
类映射到名为employees
的表。Department
类映射到名为departments
的表。Employee
类有一个department
属性,它表示一个多对一的关系。这个关系通过@ManyToOne
和@JoinColumn
注解来定义。- 主键
id
使用@GeneratedValue(strategy = GenerationType.IDENTITY)
来自动增长。
示例:多对多关系映射
下面是一个多对多关系映射的例子:
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@ManyToMany
@JoinTable(
name = "employee_project",
joinColumns = @JoinColumn(name = "employee_id"),
inverseJoinColumns = @JoinColumn(name = "project_id")
)
private List<Project> projects;
// Getters and Setters
}
@Entity
@Table(name = "projects")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "project_name")
private String name;
@ManyToMany(mappedBy = "projects")
private List<Employee> employees;
// Getters and Setters
}
在这个例子中:
Employee
类有一个projects
属性,表示一个多对多的关系。Project
类有一个employees
属性,表示相同的多对多关系。@JoinTable
定义了一个连接表employee_project
用于存储两个实体之间的关系。
示例:继承映射
下面是一个继承映射的例子:
@Entity
@Table(name = "employees")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
// Getters and Setters
}
@Entity
@DiscriminatorValue("manager")
public class Manager extends Employee {
@Column(name = "bonus")
private Double bonus;
// Getters and Setters
}
@Entity
@DiscriminatorValue("worker")
public class Worker extends Employee {
@Column(name = "hourly_rate")
private Double hourlyRate;
// Getters and Setters
}
在这个例子中:
Employee
类是抽象的,并且定义了一个名为type
的区分器列。Manager
和Worker
类继承了Employee
类,并且每个子类都有一个区分器值。
总结
以上就是使用 Hibernate 注解进行对象关系映射的一些基础示例。根据你的具体需求,可以选择适当的注解来定义实体类与数据库表之间的映射关系。如果你需要更详细的信息或者特定场景下的映射示例,请随时告诉我。