既然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"/>
- 在多线程访问数据库中同一数据的情况下,如果发现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
- 解决方案
-
- cmd中
netstat -ano|findstr 1099
,找到TCP 1099端口占用的进程ID(PID)
- cmd中
-
- 任务管理器中找到PID对应的进程(一般是java.exe),结束进程
-