目录
一、.Hibernate实体的创建规则
1.持久化类需要提供无参的构造方法
2.持久化类的属性需要私有,对私有的属性提供共有的get和set方法
3.持久化类的属性,需要尽量使用包装类型。因为包装类型和基本类型的默认值不同,比如:
4. 持久化类需要有一个唯一标识OID与表的主键对应 每个表都需要有主键
5.持久化类不要使用final来修饰-----hibernate使用cglib来生成代理对象,代理对象是继承被代理对象的如果使用final修饰,将无法继承。
二、hibernate主键生成策略
主键类型
自然主键:把具有业务含义的字段作为主键,称之为自然主键,比如身份证号码,电话号码----少见 如果出现变更维护困难
代理主键:把不具备业务含义的字段作为主键,称之为代理主键,字段一般取名为id通常为整数类型。
hibernate常用的主键生成策略
identity:主键自增,由数据库来申城主键值,录入时不需要指定主键
sequence:Oracle中的主键生成策略
increment:主键自增,由hibernate来维护,每次插入前都会查询最大的id值+1作为新的主键(开发中不使用,不安全)
hilo(了解):高低位算法,主键自增,由hibernate来维护,开发是不使用
native:hilo、sequence、identity自动三选一策略。自动识别数据库选择
uuid:产生随机字符串作为主键,主键类型必须为string类型
assigned:自然主键生成策略。hibernate不会管理主键值,由开发人员自己录入。
三、hibernate对象状态
瞬时状态 没有id没有和session关联
持久化状态 有id ,和session有关联
游离托管状态 有id没有和session关联
/**
* 测试对象三种状态
*/
@Test
public void test2(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//------数据库操作
Customer c = new Customer(); //没有id,没有和session关联==>瞬时状态
c.setCust_name("好啊好啊"); //没有id,没有和session关联==>瞬时状态
session.save(c); //执行保存 //持久化状态 有id,有关联
//~~~~~~~~~~~~~~~~~~~
transaction.commit();//提交事务
//transaction.rollback();//回滚
session.close(); //游离托管状态 有id,没有关联
}
/**
* 三种状态特点
* save方法,将瞬时状态转换成持久状态
* 主键自增,执行save方法的时候,为了将对象状态转换为持久化状态,必须生成id值,所以需要执行insert语句来生成id
*increment 执行save方法,为了生成id会执行查询最大id值的sql语句。
* */
@Test
public void test3(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//------数据库操作
Customer c= new Customer(); //没有id,没有和session关联==>瞬时状态
c.setCust_name("好啊好啊"); //没有id,没有和session关联==>瞬时状态
session.save(c); //执行保存 //持久化状态 有id,有关联
//~~~~~~~~~~~~~~~~~~~
transaction.commit();//提交事务
//transaction.rollback();//回滚
session.close(); //游离托管状态 有id,没有关联
}
/**
* 三种状态特点
* 持久化状态特点:持久化状态对象中的任何状态都会自动同步到数据库中
* */
@Test
public void test4(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//------数据库操作
Customer c = session.get(Customer.class, 3); //持久化状态 有id ,与session有关联
c.setCust_name("xxx");
//session.save(c); //执行保存 //持久化状态 有id,有关联
//~~~~~~~~~~~~~~~~~~~
transaction.commit();//提交事务
//transaction.rollback();//回滚
session.close(); //游离托管状态 有id,没有关联
}
三种状态的转换图
四、hibernate一级缓存
提高查询效率
较少不必要的修改语句发送
五、指定hibernate操作数据库的隔离级别
在主配置文件中指定
六、hibernate中的事务控制
业务在开始之前打开事务,业务执行完以后提交事务,执行过程中出现异常,则进行回滚
在dao层操作数据库需要使用session,在对service控制事务的时候也需要使用session对象完成,需要确保到层和service层使用的是同一个session对象
在hibernate中确保使用同一个session的问题
注意1.需要在主配置文件中配置
<property name="hibernate.current_session_context_class">thread</property>
然后使用getcurrentsession方法
测试
//getCurrentSession返回同一个与线程绑定的session true
@Test
public void test2(){
Session s1 = HibernateUtils.getCurrentSession();
Session s2 = HibernateUtils.getCurrentSession();
System.out.println(s1==s2);
}
//返回不同的session false
@Test
public void test3(){
Session s1 = HibernateUtils.openSession();
Session s2 = HibernateUtils.openSession();
System.out.println(s1==s2);
}
注意2:通过getCurrentSession方法获得的session对象,当提交事务后,session会自动关闭,切忌不需要手动调用close方法