hibernate中的实体规则
实体类创建的注意事项
- 持久化类提供无参数构造
- 成员变量私有,提供共有get/set方法访问.需提供属性
- 持久化类中的属性,应尽量使用包装类型
- 持久化类需要提供oid.与数据库中的主键列对应
- 不要用final修饰class
主键类型
-
自然主键(少见):表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用.
-
代理主键(常见):表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键
主键生成策略
- 代理主键:identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.
- 自然主键:assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入.
hibernate中的对象状态
对象的三种状态
- 瞬时状态:没有id,没有在session缓存中
- 持久化状态:有id,在session缓存中
- 游离|托管状态:有id,没有在session缓存中
hibernate进阶之一级缓存
- 缓存的作用:提高效率.hibernate中的一级缓存也是为了提高操作数据库的效率.
- 提高效率手段
1、提高查询效率
2、减少不必要的修改语句发送
hibernate中的事务
在hibernate中指定数据库的隔离级别
hibernate.cfg.xml 主配置文件中配置
<!-- 指定hibernate操作数据库时的隔离级别 #hibernate.connection.isolation 1|2|4|8
0001 1 读未提交
0010 2 读已提交
0100 4 可重复读
1000 8 串行化
-->
<property name="hibernate.connection.isolation">4</property>
在项目中如何管理事务
- 业务开始之前打开事务,业务执行之后提交事务. 执行过程中出现异常.回滚事务.
- 在dao层操作数据库需要用到session对象.在service控制事务也是使用session对象完成. 我们要确保dao层和service层使用的使用同一个session对象
- 在hibernate中,确保使用同一个session的问题,hibernate已经帮我们解决了. 我们开发人员只需要调用sf.getCurrentSession()方法即可获得与当前线程绑定的session对象
注意:
注意1: 调用getCurrentSession方法必须配合主配置中的一段配置
注意2:通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.
<!-- 指定session与当前线程绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
//service层
public void save(Customer customer) {
Session session = HibernateUtils.getCurrentSession();
//打开事务
Transaction tx = session.beginTransaction();
//调用Dao保存客户
try {
customerDao .save(customer);
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
//提交事务
tx.commit();
}
//Dao层
public void save(Customer customer) {
// 1 获得session
Session session = HibernateUtils.getCurrentSession();
session.save(customer);
}
hibernate中的批量查询(概述)
HQL查询-hibernate Query Language(多表查询,但不复杂时使用)
//基本查询
public static void fun1() {
// 获得session
Session session = HibernateUtils.openSession();
// 执行事务
Transaction transaction = session.beginTransaction();
// 3执行操作
// -------------------------------------------
// 1> 书写HQL语句
// String hql = "from com.geek.domain.User";
String hql = "from User";
// 2> 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
// 3> 根据查询对象获得查询结果
List<User> list = query.list();
// query.uniqueResult();//接收唯一的查询结果
System.out.println(list);
// -------------------------------------------
// 4提交事务.关闭资源
transaction.commit();
session.close();// 游离|托管 状态, 有id , 没有关联
}
//条件查询
public static void fun1() {
// 获得session
Session session = HibernateUtils.openSession();
// 执行事务
Transaction transaction = session.beginTransaction();
// 3执行操作
// -------------------------------------------
// 1> 书写HQL语句
// String hql = "from com.geek.domain.User";
//基本条件查询
String hql = "from User where uid=1";
//占位符条件查询
//String hql = "from User where uid=?";
// 设置参数,参数索引从0开始
//query.setParameter(0, 3);
// 命名占位符条件查询
//String hql = "from User where uid=:uid";
// 设置参数,通过任意命名进行设置参数
//query.setParameter("uid", 2);
// 2> 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
// 3> 根据查询对象获得查询结果
// 接收唯一的查询结果
User user = (User) query.uniqueResult();
System.out.println(user);
// -------------------------------------------
// 4提交事务.关闭资源
transaction.commit();
session.close();// 游离|托管 状态, 有id , 没有关联
}
//分页查询
public static void fun1() {
// 获得session
Session session = HibernateUtils.openSession();
// 执行事务
Transaction transaction = session.beginTransaction();
// 3执行操作
// -------------------------------------------
// 1> 书写HQL语句
// String hql = "from com.geek.domain.User";
String hql = "from User";
// 2> 根据HQL语句创建查询对象
Query query = session.createQuery(hql);
// 设置参数,通过任意命名进行设置参数
// 设置分页信息 limit ?,?
query.setFirstResult(1);
uery.setMaxResults(3);
// 3> 根据查询对象获得查询结果
List<User> list = query.list();
System.out.println(list);
// -------------------------------------------
// 4提交事务.关闭资源
ransaction.commit();
session.close();// 游离|托管 状态, 有id , 没有关联
}
Criteria查询(单表条件查询)
//基本查询
public static void fun1() {
//获得session
Session session = HibernateUtils.openSession();
//控制事务
Transaction transaction = session.beginTransaction();
//执行操作
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
//User user = (User) criteria.uniqueResult();
System.out.println(list);
//提交事务
transaction.commit();
//关闭资源
session.close();
}
//条件查询
public static void fun2() {
//获得session
Session session = HibernateUtils.openSession();
//控制事务
Transaction transaction = session.beginTransaction();
//执行操作
Criteria criteria = session.createCriteria(User.class);
//设置条件
criteria.add(Restrictions.eq("id", 1));
User user = (User) criteria.uniqueResult();
System.out.println(user);
//提交事务
transaction.commit();
//关闭资源
session.close();
}
//分页查询
public static void fun3() {
// 获得session
Session session = HibernateUtils.openSession();
// 控制事务
Transaction transaction = session.beginTransaction();
// 执行操作
Criteria criteria = session.createCriteria(User.class);
//设置分页信息
criteria.setFirstResult(1);
criteria.setMaxResults(3);
//执行查询
List list = criteria.list();
System.out.println(list);
// 提交事务
transaction.commit();
// 关闭资源
session.close();
}
// 分页最多行数查询
public static void fun4() {
// 获得session
Session session = HibernateUtils.openSession();
// 控制事务
Transaction transaction = session.beginTransaction();
// 执行操作
Criteria criteria = session.createCriteria(User.class);
//使用聚合函数,查询最多行数
criteria.setProjection(Projections.rowCount());
Long uniqueResult = (Long) criteria.uniqueResult();
System.out.println(uniqueResult);
// 提交事务
transaction.commit();
// 关闭资源
session.close();
}
原生SQL查询(复杂的业务查询)
//基本查询,返回数组list
public static void fun1() {
// 获得session
Session session = HibernateUtils.openSession();
// 控制事务
Transaction transaction = session.beginTransaction();
// 执行操作
//1、sql语句
String sql = "select * from user";
//2、创建sql查询对象
SQLQuery query = session.createSQLQuery(sql);
//调用方法查询结果
List<Object []> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
}
//基本查询,返回对象集合
public static void fun2() {
// 获得session
Session session = HibernateUtils.openSession();
// 控制事务
Transaction transaction = session.beginTransaction();
// 执行操作
// 1、sql语句
String sql = "select * from user";
// 2、创建sql查询对象
SQLQuery query = session.createSQLQuery(sql);
//将结果封装到对象中去
query.addEntity(User.class);
// 调用方法查询结果
List<User> list = query.list();
System.out.println(list);
}
//分页查询
public static void fun3() {
// 获得session
Session session = HibernateUtils.openSession();
// 控制事务
Transaction transaction = session.beginTransaction();
// 执行操作
// 1、sql语句
String sql = "select * from user limit ?,?";
// 2、创建sql查询对象
SQLQuery query = session.createSQLQuery(sql);
//3、 设置分页信息
query.setParameter(0,1);
query.setParameter(1,2);
// 将结果封装到对象中去
query.addEntity(User.class);
// 调用方法查询结果
List<User> list = query.list();
System.out.println(list);
}