对象之间相互关联,toString()不要相互引用,java.lang.StackOverflowError 。
HQL查询
语法和SQL类似,可以实现SQL语句的大部分功能,支持链式编程风格,复杂查询直接使用SQL,Hiberante查询效率不高。
@Test public void test01() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); //匿名参数查询 Query query = session.createQuery(" from Customer where name=?"); query.setParameter(0, "孙艺珍"); List<Customer> list = query.list(); System.out.println(list); //有名参数查询 Query query = session.createQuery(" from Customer where name=:name"); query.setParameter("name", "孙艺珍"); List<Customer> list = query.list(); //参数为对象, 对象作为条件时按id查询 Customer c1 = (Customer) session.get(Customer.class, 1); Query query = session.createQuery("from Order where customer =?"); query.setEntity(0, c1); List<Order> list = query.list(); System.out.println(list); transaction.commit(); session.close(); }
通过对象导航的方式查询所有客户为孙艺珍的订单
@Test public void test06() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); Customer c1 = (Customer) session.get(Customer.class, 1); Query query = session.createQuery("from Order where customer.name =?"); query.setParameter(0, "孙艺珍"); List<Order> list = query.list(); System.out.println(list); transaction.commit(); session.close(); }
uniqueResult()如果返回1个或0个结果没有异常,返回0个结果时,结果为null,结果大于1会有异常,通常用于分组函数,sum、count、avg、max、min,返回值是long类型
long count= (Long) session.createQuery("select count(*) from Customer").uniqueResult();
命名查询,将HQL写道配置文件中,在Customer.hbm.xml中增加配置
<query name="findCustomerByName"> <![CDATA[from Customer where name=?]]> </query>
程序中通过xml配置中的name属性名称调用
List list = session.getNamedQuery("findCustomerByName").setParameter(0, "孙艺珍").list();
QBC(Query By Criteria)查询
通过面向对象的方式查询
查询所有的Customer数据
@Test public void test02() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); List<Customer> list = session.createCriteria(Customer.class).list(); System.out.println(list); transaction.commit(); session.close(); }
查询Customer为孙艺珍的数据
List<Customer> list = session.createCriteria(Customer.class).add(Restrictions.eq("name", "孙艺珍")).list();
查询1号客户的所有订单
Customer c1 = (Customer) session.get(Customer.class, 1); List<Customer> list = session.createCriteria(Order.class).add(Restrictions.eq("customer",c1)).list();
查询客户为孙艺珍的所有订单,不能采用对象导航的方式,也就是不能用“.”
List<Customer> list = session.createCriteria(Order.class).add(Restrictions.eq("customer.name", "孙艺珍")).list(); //org.hibernate.QueryException: could not resolve property: customer.name of: rock.lee.bean.Order
如果根据对象除id以外的属性查询,通过设置别名的方式
Customer c1 = (Customer) session.get(Customer.class, 1); List<Customer> list = session.createCriteria(Order.class).createAlias("customer", "c").add(Restrictions.eq("c.name", "孙艺珍")).list();
根据id排序
List<Customer> list = session.createQuery("from Customer order by id desc").list(); List<Customer> list = (List<Customer>) session.createCriteria(Customer.class).addOrder(org.hibernate.criterion.Order.desc("id")).list();
离线查询,在没有session的情况下创建查询对象,设置查询条件
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class); detachedCriteria.add(Restrictions.like("name", "张%")); Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); List<Customer> customers = detachedCriteria.getExecutableCriteria(session).list(); System.out.println(customers); transaction.commit(); session.close();
SQL查询
查询表所有列数据时返回Object[]
@Test public void test03() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); SQLQuery sqlQuery = session.createSQLQuery("select * from customer"); List<Object[]> list = sqlQuery.list(); for (Object[] objs : list) { System.out.println(Arrays.toString(objs)); } transaction.commit(); session.close(); }将查询结果绑定到对象上,addEntity()是SQLQuery独有的,查询的列必须和Entity的字段对应
@Test public void test04() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); SQLQuery sqlQuery = session.createSQLQuery("select * from customer"); List<Customer> list = sqlQuery.addEntity(Customer.class).list(); System.out.println(list); transaction.commit(); session.close(); }
事务四大特性:ACID 原子性、一致性、隔离性、持久性
事务隔离引发的问题:
脏读:一个事务读取另一个事务为提交数据
不可重复读:一个事务读取到另一个事务已经提交的数据(update)
幻读:一个事务读取到另一个事务已经提交的数据(insert)
丢失更新:两个事务同时修改一条数据,后提交的数据覆盖了前一个事务提交的数据
事务隔离级别:
READ_UNCOMMITED 会发生所有隔离问题
READ_COMMITTED 会阻止脏读发生,但是会发生 不可重复读和幻读
REPEATABLE_READ 会阻止脏读和不可重复读,会发生幻读
SERIALIZABLE 以串行方式处理事务 , 同一时间只有一个事物,没有并发,没有隔离问题 (效率问题)
MySQL 数据库默认级别 REPEATABLE_READ , Oracle 数据库默认级别 READ_COMMITTED
hibernate 提供 hibernate.connection.isolation 属性, 用来修改数据库默认隔离级别 , 取值 1 2 4 8
1—Read uncommitted isolation
2—Read committed isolation
4—Repeatable read isolation
8—Serializable isolation
mysql 默认是4 , oracle 默认 2 hibernate.cfg.xml 修改隔离级别
<property name="hibernate.connection.isolation">2</property>
解决丢失更新的两种方式:
1、悲观锁:保证同一时间 只有一个人在修改,不会丢失更新 (缺点: 效率问题)
2、乐观锁:为数据添加一列版本字段,每次修改数据后 版本+1 (当版本不一致无法修改),不依赖数据库底层锁机制, 可以并发修改 。
<version name="ver"></version>
相关推荐
21.1 多个事务并发运行时的并发问题 21.1.1 第一类丢失更新 21.1.2 脏读 21.1.3 虚读 21.1.4 不可重复读 21.1.5 第二类丢失更新 21.2 数据库系统的锁的基本原理 21.2.1 锁的多粒度性及自动锁升级 ...
### 精通Hibernate(Part 1):孙卫琴 #### Hibernate简介 Hibernate是一个开源的对象关系映射(Object Relational Mapping,ORM)框架,它为Java应用提供了一种将对象模型与数据库模型进行映射的方法。通过使用...
《Hibernate程序高手秘笈》是针对Java开发人员深入学习Hibernate框架的一本专业书籍,主要涵盖了Hibernate的核心概念、配置、实体映射、查询语言以及高级特性。这部分内容包括了第四到第六部分,通常会讲解更深入的...
21.1 多个事务并发运行时的并发问题 21.1.1 第一类丢失更新 21.1.2 脏读 21.1.3 虚读 21.1.4 不可重复读 21.1.5 第二类丢失更新 21.2 数据库系统的锁的基本原理 21.2.1 锁的多粒度性及自动锁升级 ...
21.1 多个事务并发运行时的并发问题 21.1.1 第一类丢失更新 21.1.2 脏读 21.1.3 虚读 21.1.4 不可重复读 21.1.5 第二类丢失更新 21.2 数据库系统的锁的基本原理 21.2.1 锁的多粒度性及自动锁升级 ...
21.1 多个事务并发运行时的并发问题 21.1.1 第一类丢失更新 21.1.2 脏读 21.1.3 虚读 21.1.4 不可重复读 21.1.5 第二类丢失更新 21.2 数据库系统的锁的基本原理 21.2.1 锁的多粒度性及自动锁升级 ...
3. 数据库版本:关注数据库管理系统(DBMS)的更新,如MySQL、Oracle的版本特性及性能优化。 4. 动态新闻信息显示:可能涉及数据库查询优化、缓存策略和模板引擎技术。 5. Hibernate与Oracle分布处理:考察ORM...
通过研究这些源码,开发者可以深入理解如何在实际项目中应用SSH框架,如何组织项目结构,如何进行数据库设计,以及如何处理并发、安全、性能优化等问题。 每个项目可能包含了以下部分: - **Model**:业务实体类,...
10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...
10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...
14. **缓存技术**:Redis或Ehcache作为缓存中间件,减少数据库压力,提升响应速度。 15. **数据库设计**:包括表结构设计、索引优化、事务处理等,确保数据一致性与系统性能。 16. **API文档**:Swagger或Postman...
3. **Hibernate ORM**:Hibernate是一个流行的ORM(对象关系映射)工具,允许开发者用Java对象直接操作数据库。学习配置Hibernate,理解HQL语言,以及实体管理和关联映射。 4. **JavaBeans与MVC模式**:JavaBeans...
【标题】"Struts+Spring+JSF+Hibernate+EJB+XML+WebService+Ajax(part1)" 描述了一个全面的J2EE开发教程,涵盖了多个关键的技术栈,包括但不限于MVC框架Struts,依赖注入框架Spring,JavaServer Faces(JSF),持久...
2.17 使用TaskExecutor实现并发性 101 2.17.1 问题 101 2.17.2 解决方案 101 2.17.3 工作原理 102 2.18 小结 110 第3章 Spring AOP和AspectJ支持 112 3.1 启用Spring的AspectJ注解支持 113 3.1.1 ...
2.17 使用TaskExecutor实现并发性 101 2.17.1 问题 101 2.17.2 解决方案 101 2.17.3 工作原理 102 2.18 小结 110 第3章 Spring AOP和AspectJ支持 112 3.1 启用Spring的AspectJ注解支持 113 3.1.1 ...
11. **JDBC**:Java数据库连接(JDBC)是用于与各种数据库交互的标准API,可用于执行SQL查询和管理数据库事务。 12. **Java EE**:Java企业版(Java EE)是一个服务器端开发平台,包含了多种服务组件(如Servlets, ...