上一篇
Hibernate之环境搭建及demo分享
- 行业动态
- 2025-05-11
- 2
Hibernate环境搭建需配依赖、写配置,demo展示增删改查及映射关系,体现ORM
Hibernate之环境搭建及demo分享
环境准备与依赖配置
Hibernate作为Java持久层框架,需要依赖多个组件协同工作,以下是完整的环境搭建步骤及关键配置说明:
组件类别 | 软件/版本 | 说明 |
---|---|---|
JDK | JDK8+(推荐JDK17) | 需配置JAVA_HOME环境变量 |
IDE | IntelliJ IDEA/Eclipse(推荐2023.1+版本) | 支持Maven项目管理的IDE |
构建工具 | Maven 3.6+/Gradle 7.0+ | 用于依赖管理和项目构建 |
数据库 | MySQL 8.0+(或其他关系型数据库) | 需创建测试数据库(如hibernate_demo ) |
Hibernate核心 | hibernate-core 5.6.15.Final | Maven中央库坐标 |
驱动依赖 | mysql-connector-java 8.0.33 | 根据数据库类型选择对应驱动 |
日志框架 | slf4j-api 1.7.36 + logback-classic 1.2.11 | 建议使用Logback实现日志输出 |
Maven依赖配置示例:
<dependencies> <!-Hibernate核心 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version> </dependency> <!-MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-日志框架 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> <!-JUnit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies>
核心配置文件解析
Hibernate通过hibernate.cfg.xml
进行全局配置,关键参数说明如下:
参数 | 示例值 | 作用描述 |
---|---|---|
hibernate.dialect | org.hibernate.dialect.MySQL8Dialect | 指定数据库方言(影响SQL生成) |
hibernate.show_sql | true | 控制台打印生成的SQL语句 |
hibernate.format_sql | true | 格式化输出SQL(便于阅读) |
hibernate.hbm2ddl.auto | update | 自动建表策略(开发环境常用) |
connection.url | jdbc:mysql://localhost:3306/hibernate_demo | 数据库连接地址 |
connection.username | root | 数据库用户名 |
connection.password | 123456 | 数据库密码 |
connection.pool_size | 10 | 连接池大小(建议生产环境使用C3P0) |
完整配置文件示例:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-数据库连接配置 --> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/hibernate_demo?serverTimezone=UTC</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <!-方言与SQL格式 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!-自动建表策略 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-映射文件位置 --> <mapping resource="com/example/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
实体映射与Demo实现
以用户管理功能为例,演示Hibernate基础CRUD操作。
实体类与映射文件
// User.java(实体类) package com.example.entity; public class User { private Long id; private String username; private String password; private String email; // Getter/Setter方法省略 }
<!-User.hbm.xml(OGG映射文件) --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.example.entity.User" table="t_user"> <id name="id" column="id"> <generator class="native"/> </id> <property name="username" column="username" length="50"/> <property name="password" column="password" length="100"/> <property name="email" column="email" length="100"/> </class> </hibernate-mapping>
Hibernate工具类
// HibernateUtil.java package com.example.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { // 加载hibernate.cfg.xml并添加映射文件 Configuration config = new Configuration().configure(); config.addAnnotatedClass(com.example.entity.User.class); // 如果使用注解 return config.buildSessionFactory(); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
CRUD操作示例
// UserDAO.java package com.example.dao; import com.example.entity.User; import com.example.util.HibernateUtil; import org.hibernate.Session; import org.hibernate.Transaction; import java.util.List; public class UserDAO { // 保存用户 public void save(User user) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); session.save(user); tx.commit(); session.close(); } // 查询所有用户 public List<User> findAll() { try (Session session = HibernateUtil.getSessionFactory().openSession()) { return session.createQuery("from User", User.class).list(); } } // 更新用户邮箱 public void update(Long userId, String newEmail) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); User user = session.get(User.class, userId); if (user != null) { user.setEmail(newEmail); session.update(user); } tx.commit(); session.close(); } // 删除用户 public void delete(Long userId) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); User user = session.get(User.class, userId); if (user != null) { session.delete(user); } tx.commit(); session.close(); } }
测试验证
// HibernateTest.java package com.example; import com.example.dao.UserDAO; import com.example.entity.User; import org.junit.Test; import java.util.List; public class HibernateTest { private UserDAO userDAO = new UserDAO(); @Test public void testSave() { User user = new User(); user.setUsername("john_doe"); user.setPassword("123456"); user.setEmail("john@example.com"); userDAO.save(user); } @Test public void testFindAll() { List<User> users = userDAO.findAll(); users.forEach(user -> System.out.println(user.getUsername())); } }
常见问题与解决方案(FAQs)
Q1:启动时提示”Could not obtain connection”如何解决?
A1:该错误通常由以下原因引起:
- 数据库服务未启动或连接地址错误
hibernate.cfg.xml
中的用户名/密码配置错误- 缺少对应数据库驱动依赖
- 防火墙拦截了数据库端口(默认3306)
解决步骤:
- 检查
connection.url
是否包含正确的IP和端口号 - 验证数据库用户名/密码的正确性
- 确认Maven已正确下载驱动依赖(检查本地仓库)
- 使用
telnet localhost 3306
测试数据库连通性 - 查看完整的堆栈日志定位具体错误位置
Q2:执行查询时出现”could not initialize proxy”异常怎么办?
A2:该问题源于Hibernate的懒加载机制,当Session关闭后访问延迟加载的关联属性时触发,解决方案包括:
- 开启二级缓存
在hibernate.cfg.xml
中添加缓存配置:<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
- 调整抓取策略
在映射文件中显式设置急加载:<many-to-one name="department" column="dept_id" fetch="join"/>
- DTO模式转换
将实体转为不含懒加载属性的DTO对象后再返回给前端,避免跨Session访问