hiberbate

主键关联:从表的主键,同时又是主表的外键,从表没有单独的外键列 外键关联:从表中存在外键列,关联主表的主键列。但外键列是不重复的

cascade和inverse的区别: cascade表示级联操作,当主表记录做操作时,从表记录做相应的操作,维护的是记录 inverse表示控制反转。当该属性设置为真是,表示由关联对象维护外键关系,当前对象不做外键维护,维护的是外键 一般来说,inverse设置在一方,外键由从表维护

什么是缓存

  1. 缓存就是数据库数据在内存中的临时容器
  2. 位于数据库与数据库访问层中间
  3. ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如果发现所需的数据,则直接将此数据作为结果加以利用
  4. 避免了数据库调用性能的开销
  5. 相对内存操作而言,数据库调用是一个代价高昂的过程

缓存分类

  1. 一级缓存:即在当前事务范围内的数据缓存——就hiberbate来讲一级缓存事务级缓存是基于session的生命周期实现的,session一旦关闭,一级缓存就清除,一级缓存为hiberbate自带的缓存,是必须的
  2. 应用级二级缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享——在hiberbate中,应用级缓存由sessionFactory实现
  3. 分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略

延迟加载类型

  1. 实体对象的延迟加载
  2. 集合的延迟加载(一对多和多对多时,关联集合)
  3. 属性的延迟加载(clob大数据类型时)

clob和blob区别

  1. clob:存放大文本的类型
  2. blob:存放二进制数据的类型

hiberbate支持两种锁机制

  1. 悲观锁(pessimistic locking):实现依赖于数据库机制,在整个过程中,将数据锁定,其他任何用户不能对其读取和修改,一般适合短事务,并发性不好
  2. 乐观锁(optimistic locking):1.为数据增加一个版本标识,增加一个version字段;2.读取数据时,将版本号一同读出;3.更新时,版本号加一;3.将提交数据的版本与数据库表对应记录的当前版本信息进行比对;4.如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据

数据库隔离级别

  1. read uncommited没有提交,就能读到,比如发出insert,在没有提交时就能更新数据库
  2. read commited提交读,提交之后,才可以更新数据库
  3. repeatable read可重复读
  4. serializable可序列化读

数据库连接池

  1. 每一次请求都要建立一次数据库连接
  2. 每一次数据库连接,使用完后都得断开
  3. 不能控制被创建的连接对象数
  4. 频繁的数据库连接操作势必占用很多的系统资源,响应速度必定下降。程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。系统资源被毫无顾及的分配出去,如果接过多,也可能导致内存泄漏,服务器崩溃
  5. 连接池作用:为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕之后在放回去,通过设定连接池最大连接数来放置系统无休止的数据库连接。更为重要的是可以通过连接池的管理机制监视数据库的连接的数量,使用情况,为系统开发,测试及性能调整提供依据

连接池的工作流程

持久层向连接池申请一个连接。连接池返回一个空闲连接。如果没有空闲连接,那么就检查连接池中的连接数量是否到达最大连接数。如果没有到达最大连接,则建立新的连接对象放入连接池中,如果到达最大连接数,那么用户就需要等待。这时,可以设置最大等待时间来控制用户的等待状态。等待时间内,有别的连接对象被释放,那么就分配给等待用户,如果超时,那么返回null。

hiberbate常见的优化策略

  1. 用高版本的hiberbate
  2. 制定合理的缓存策略
  3. 采用合理的session管理机制
  4. 尽量使用延迟加载
  5. 如有可能,采用UUID作为主键生成策略
  6. 如有可能,选用乐观锁代替悲观锁
  7. 在开发中,显示hiberbate执行的SQL语句,从而指定更好的实现策略
  8. 复杂查询和统计查询可以使用SQL语句完成,甚至可以考虑使用存储过程完成
### Hibernate框架的工作原理 Hibernate 是一种开放源码的对象关系映射 (ORM) 框架,其核心功能是通过对象化的方式简化 Java 应用程序与数据库之间的交互。它通过对 JDBC 的轻量级封装,实现了 POJO(Plain Old Java Object)到数据库表的自动映射[^4]。 #### 工作流程 1. **配置阶段**: 配置文件 `hibernate.cfg.xml` 和 `.hbm.xml` 文件定义了 Hibernate 与数据库的连接参数以及实体类和数据库表之间的映射关系。 2. **SessionFactory 创建**: 使用 `Configuration` 类加载配置并构建 `SessionFactory` 实例。此实例在整个应用生命周期中通常是单例模式存在,因为它是一个重量级对象[^5]。 3. **Session 获取**: 调用 `SessionFactory.openSession()` 方法获取一个 `Session` 对象。`Session` 表示一次事务范围内的持久化操作单元。 4. **数据操作**: 利用 `Session` 提供的方法执行增删改查等操作。 5. **事务管理**: 所有数据库修改都需在一个显式的事务范围内完成。使用 `Transaction` 接口控制提交或回滚行为。 6. **清理资源**: 关闭 `Session` 并释放相关资源。 以下是完整的代码实现: ```java import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class HibernateExample { public static void main(String[] args) { // 加载配置文件并创建SessionFactory Configuration configuration = new Configuration().configure(); SessionFactory sessionFactory = configuration.buildSessionFactory(); // 开启Session try (Session session = sessionFactory.openSession()) { Transaction transaction = session.beginTransaction(); // 假设有一个名为User的POJO类已经映射好 User user = new User(); user.setName("John Doe"); user.setEmail("john.doe@example.com"); // 存储对象至数据库 session.save(user); // 提交事务 transaction.commit(); } catch (Exception e) { System.out.println(e.getMessage()); } } } ``` 上述代码展示了如何利用 Hibernate 完成基本的数据存储操作。 --- ### 核心组件解析 - **Configuration**: 主要负责读取和解析 XML 或注解形式的配置信息。 - **SessionFactory**: 生产线程安全的 `Session` 实例,通常整个应用程序只初始化一次。 - **Session**: 数据库会话的主要接口,提供 CRUD 功能支持。 - **Transaction**: 封装底层 JDBC 事务机制,确保一致性。 - **Query/Criteria API**: 支持灵活查询方式,包括 HQL 查询语言和 Criteria 查询标准。 --- ### 映射文件结构说明 `.hbm.xml` 文件用于声明类与数据库表之间的一一对应关系。例如: ```xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.example.User" table="users"> <id name="id" type="long"> <generator class="increment"/> </id> <property name="name" column="username" type="string"/> <property name="email" column="user_email" type="string"/> </class> </hibernate-mapping> ``` 而 `hibernate.cfg.xml` 则作为全局配置入口,指定数据库驱动、URL、用户名密码以及其他必要的设置[^3]: ```xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/testdb</property> <property name="connection.username">root</property> <property name="connection.password">password</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <!-- List of XML mapping files --> <mapping resource="com/example/User.hbm.xml"/> </session-factory> </hibernate-configuration> ``` --- ### 总结 Hibernate 不仅提供了强大的 ORM 解决方案,还极大地减少了开发者手动处理 JDBC 的复杂度。借助于清晰的分层架构设计,使得业务逻辑更加专注于领域模型而非繁琐的 SQL 编写工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值