hibernate注解开发教程:从配置到实战,新手快速上手避坑指南

admin Hibernate教程 17


用 Hibernate 做开发的新手是不是总被 XML 映射文件搞得头大?写个实体类还要单独配个.hbm.xml,属性名改了两处都要改,稍不注意就映射出错;听说注解开发能省掉 XML 文件,可对着@Entity @Id这些注解不知道怎么用,加了注解程序还是报 “映射未找到” 的错误。别着急,兔子哥当年学注解开发时,光搞懂注解导哪个包就试了三次,第一次用@Table注解时还把表名写错,查了半天没数据才发现表名和数据库对不上。今天就带大家从注解配置讲到实战案例,把新手最容易踩的坑全列出来,用注解开发 Hibernate 真没那么难,一起往下看吧!

一、注解开发是什么?比 XML 好在哪?新手先搞懂这两点


很多人听说注解开发简单,却不知道它到底是什么,先把基础概念捋顺,学起来更顺。
  1. 注解开发:用代码里的 “标签” 代替 XML 配置
    简单说,注解开发就是在实体类的代码上直接加注解(带@的标签),告诉 Hibernate 实体类和数据库表怎么对应,不用再写单独的 XML 映射文件。比如在实体类上加@Entity表示这是映射实体,在主键属性上加@Id表示这是主键,比 XML 配置更直观,代码和映射规则放一起,改起来也方便。
  2. 和 XML 比,注解开发的 3 个明显优势

  • 不用维护单独的映射文件,少了一个文件就少了出错的地方,新手不用再担心 XML 路径写错、标签闭合不对的问题。
  • 实体类属性改了,直接在注解里改就行,不用在 Java 类和 XML 文件之间来回切换,开发效率高很多。
  • 注解写在代码里,一眼就能看到映射规则,团队协作时别人看代码也能快速明白表结构,不用翻两个文件。

网友 “后端小白” 分享:“之前用 XML 配置,改个字段名忘了同步 XML,调试半天才发现问题,换成注解后直接在属性上改,再也没犯过这错!”

二、注解开发基础配置:3 步搞定环境,比 XML 还简单


注解开发的配置和 XML 大同小异,但有几个关键步骤不能少,新手跟着做,环境很快就能搭好。
  1. 第一步:加依赖,别漏了注解需要的包
    用 Maven 管理的项目,pom.xml 里除了 Hibernate 核心依赖,还要加 JPA 注解的依赖(Hibernate 注解基于 JPA 规范),不然注解会不生效:

xml
<dependency><groupId>org.hibernategroupId><artifactId>hibernate-coreartifactId><version>5.4.32.Finalversion>dependency><dependency><groupId>javax.persistencegroupId><artifactId>javax.persistence-apiartifactId><version>2.2version><scope>providedscope>dependency><dependency><groupId>mysqlgroupId><artifactId>mysql-connector-javaartifactId><version>8.0.28version>dependency>

没用到 Maven 的话,手动下载这些 jar 包放到 lib 目录,少一个包都可能报 “注解找不到” 的错误。
  1. 第二步:改核心配置,开启注解扫描
    核心配置文件(hibernate.cfg.xml)基本和 XML 开发一样,但映射部分不用写,换成注解类扫描:

xml
<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driverproperty><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db?serverTimezone=UTCproperty><property name="hibernate.connection.username">rootproperty><property name="hibernate.connection.password">123456property><property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialectproperty><property name="hibernate.show_sql">trueproperty><mapping package="com.hibernate.annotation.entity"/>session-factory>hibernate-configuration>

这步最容易忘!如果没加,Hibernate 找不到注解类,会报 “No persistent classes found” 错误。
  1. 第三步:写实体类,加注解映射规则
    以 User 表为例,实体类 User.java 加注解后是这样的:

java
import javax.persistence.*; // 注解都从这个包导入// @Entity表示这是映射实体,@Table指定对应数据库表名@Entity@Table(name = "user") // 表名和数据库一致,不写默认用类名当表名public class User {// @Id指定主键,@GeneratedValue指定主键生成策略@Id@GeneratedValue(strategy = GenerationType.IDENTITY) // MySQL自增private Integer id;// @Column指定表字段名,和属性名一致可省略@Column(name = "name")private String name;@Column(name = "age")private Integer age;// 必须有getter和setter方法,不然Hibernate拿不到值public Integer getId() { return id; }public void setId(Integer id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public Integer getAge() { return age; }public void setAge(Integer age) { this.age = age; }}

注解说明:
  • @Entity:标记这是需要映射的实体类,必须加。
  • @Table(name = "user"):指定对应数据库的表名,name 值要和数据库表名完全一致。
  • @Id:标记主键属性,没加这个会报 “没有主键映射” 错误。
  • @GeneratedValue(strategy = GenerationType.IDENTITY):主键生成策略,MySQL 用 IDENTITY(自增)。

三、注解开发实战:增删改查代码,和 XML 开发有啥不一样?


注解开发的 CRUD 操作和 XML 开发基本一样,核心还是通过 Session 对象操作,只是实体类不用 XML 映射了,一起看具体案例。
  1. 工具类:获取 Session,和 XML 开发通用
    新建 HibernateUtils.java,和 XML 开发时一样,用来获取 SessionFactory 和 Session:

java
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtils {private static SessionFactory sessionFactory;static {// 加载核心配置,会自动扫描注解类Configuration cfg = new Configuration().configure();sessionFactory = cfg.buildSessionFactory();}public static Session getSession() {return sessionFactory.openSession();}}

  1. 添加操作:save () 方法保存对象

java
import org.hibernate.Session;import org.hibernate.Transaction;public class AddTest {public static void main(String[] args) {Session session = HibernateUtils.getSession();Transaction tx = session.beginTransaction(); // 别忘开事务// 创建对象并赋值User user = new User();user.setName("李四");user.setAge(22);// 保存session.save(user);tx.commit(); // 提交事务session.close();}}

运行后控制台会显示生成的 INSERT 语句,数据库 user 表会新增一条记录,和 XML 开发效果一样,但少了 XML 映射文件的配置。
  1. 查询、更新、删除:代码和 XML 开发完全相同

  • 查询:用session.get(User.class, 1)根据主键查对象。
  • 更新:查对象→改属性→session.update(user)
  • 删除:查对象→session.delete(user)
    这几步和 XML 开发的代码一模一样,因为注解已经搞定了映射,Hibernate 操作对象的方式不变。

四、避坑指南:新手用注解开发最容易踩的 5 个坑


  1. 坑 1:注解不生效,报 “No persistent classes found”
    90% 是核心配置没加注解扫描!解决:在 hibernate.cfg.xml 里加,确保包路径或类路径正确。
  2. 坑 2:注解导错包,报 “注解不是合法的类型”
    新手容易导成 Hibernate 自己的注解包(org.hibernate.annotations),正确应该导 JPA 的包javax.persistence.*,大部分注解都在这个包下,别导错了。
  3. 坑 3:主键生成策略不对,报 “无法获取主键”
    MySQL 用GenerationType.IDENTITY,Oracle 用SEQUENCE,如果 MySQL 用了其他策略,会报主键生成错误。解决:@GeneratedValue(strategy = GenerationType.IDENTITY)
  4. 坑 4:表名或字段名不匹配,查不到数据或插入失败
    @Table(name = "user")的 name 值必须和数据库表名完全一致(包括大小写),@Column(name = "name")的 name 值要和表字段名一致,不一致就会查不到数据。
  5. 坑 5:没开事务,增删改后数据库没变化
    注解只是解决映射问题,事务管理没变!增删改必须手动开事务(session.beginTransaction()),操作完提交(tx.commit()),不然数据不会写入数据库,这是新手最容易忘的。

网友 “注解踩坑王” 分享:“之前增删改总没效果,以为是注解错了,后来发现是没开事务,加上事务提交后立马有数据了,事务太重要了!”

五、自问自答:新手学注解开发常问的 3 个问题


  1. “注解开发和 XML 开发哪个好?新手该选哪个?”
    推荐新手学注解开发!注解更直观,不用维护额外文件,出错概率低;XML 适合复杂映射或需要频繁改映射规则的场景。现在企业开发用注解的越来越多,学注解更实用。
  2. “实体类属性名和表字段名一样,还要加 @Column 吗?”
    可以不加!@Column的 name 属性和属性名一致时,能省略不写,Hibernate 会默认用属性名当字段名,但为了清晰,建议加上,别人看代码能一眼知道对应哪个字段。
  3. “注解能和 XML 一起用吗?有冲突怎么办?”
    能一起用,但不推荐!如果同一个实体类既有注解又有 XML 映射,XML 的配置会覆盖注解,容易混乱。新手最好只用一种方式,别混着用。

结尾心得


注解开发真的能帮新手省去很多 XML 配置的麻烦,只要把核心配置和实体类注解写对,增删改查操作和之前一样简单。兔子哥的经验是,学注解开发时多注意细节:包别导错、配置别漏扫描、事务别忘提交,这几点做好了,大部分问题都不会出现。刚开始可以从简单的实体类做起,熟悉常用注解的用法,慢慢就会发现注解开发比 XML 方便多了。坚持多写案例,遇到错误对照避坑指南排查,你会发现用注解开发 Hibernate 真的很轻松,加油!

标签: org.hibernate 大同小异

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~