Hibernate(3):事务&查询

本文主要探讨了Hibernate中的事务管理,包括悲观锁、乐观锁和绑定当前线程的Session。在悲观锁中,数据在被事务操作时会被锁定,但效率较低。乐观锁通过在Javabean中添加version字段实现并发控制。此外,文章还介绍了如何在业务层开启事务。在查询方面,讲解了HQL和Criteria查询,尽管Criteria在5.2版本后已过时。最后,针对IDEA运行项目时出现的1099端口占用问题,给出了找到并结束占用进程的解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

既然Hibernate要和数据库交互,那么事务是必须要掌握的部分

(一)事务

为什么要锁:在并发访问的时候,不使用锁会导致部分数据并不能保存到数据库

(1)悲观锁

  • 悲观锁:数据库提供
    • 被一个事务操作的一条数据会被加锁,操作完成之后释放锁
    • 缺点:效率低

(2)乐观锁

  • 乐观锁
    • 在Javabean中添加一个字段version以及对应方法
    • 在xx.hbm.xml中配置version
	private int version; //版本号
	public void setVersion(int version){
		this.version = version;
	}
	public int getVersion(){
		return this.version;
	}
	<version name="version"/>

(3)绑定当前线程的session

  • 目的:为了能在业务层开启事务,而不是在持久层
  • 首先在hibernate.cfg.xml中配置
	<property name="hibernate.current_session_context_class">thread</property>
  • 没有框架的情况:使用ThreadLocal保存Transaction对象,保证同一个线程使用的是同一个事务
  • 使用Hibernate框架:SessionFactory的getCurrentSession()获取当前线程下的session

(二)查询

  • 相比于使用原生的JDBC的DAO层的查询时构造的工具类,Hibernate中的查询简化了部分语句,可以直接使用封装好的方法
		//一个查询Demo
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();

		//使用JPA-style的查询语句
		Query query = session.createQuery("from User where age > ?0");
		query.setInteger(0,100);
		List<User> list = query.list();

		for(User user : list){
			System.out.println(user.getName());
		}

		tr.commit();
		session.close();

(1)HQL

  • HQL(Hibernate Query Language)
    • Query query = session.createQuery("from User where age > ?0");

(2)Criteria

Hibernate5.2版本之后Criteria接口已经过时,懒得填坑了…

(三)1099占用解决方案

  • 最近在使用IDEA跑项目的时候经常遇到的报错Error running 'Unnamed': Address localhost:1099 is already in use
  • 解决方案
      1. cmd中netstat -ano|findstr 1099,找到TCP 1099端口占用的进程ID(PID)
      1. 任务管理器中找到PID对应的进程(一般是java.exe),结束进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值