Hibernate 注释

在 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 的区分器列。
  • ManagerWorker 类继承了 Employee 类,并且每个子类都有一个区分器值。

总结

以上就是使用 Hibernate 注解进行对象关系映射的一些基础示例。根据你的具体需求,可以选择适当的注解来定义实体类与数据库表之间的映射关系。如果你需要更详细的信息或者特定场景下的映射示例,请随时告诉我。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值