Hibernate 主键生成策略、一级缓存及事务管理
1.持久化类的编写规则
对持久化类提供一个无参的构造方法 底层:反射生成实例
属性需要私有,提供public 的set和get方法 :Hibernate 中获取,设置对象的值。
对持久化类提供一个唯一标识的 OID 与数据库主键对应 :java中通过对象地址区分是否是同一对象,数据库中通过主键确认是否是同一个记录,在hibernate中通过持久化类的OID的属性区分是否是同一对象。
持久化类中的属性尽量使用包装类属性,包装类型默认值为null,基本数据类型默认值为0,有歧义。
持久化类不要使用final修饰 :延迟加载本来就是Hibernate 的一种优化手段,返回的是一个代理对象(javassist,可以对没有实现接口的类产生代理—是用来非常底层字节码增强技术,继承这个类进行代理)。如果类被final 修饰不能被继承了,就不能产生代理对象,延迟加载也就失效,此时的get 方法和load方法 一致。
2.主键生成策略
2.1主键的分类
2.1.1自然主键
主键本身就是表中的一个字段(实体中的一个具体的属性)
创建一个人员表,人员都会有一个身份证号(唯一不可重复),人员的身份证号作为主键,这种主键为自然主键。
2.1.2代理主键(尽量使用)
主键的本身不是表中必须的一个字段(不是实体类的牧歌具体的属性)
创建一个人员表,没有使用人员中的身份证号,用了一个与这个表不相关的字段ID(PNO),这种主键就是代理主键。
在实际开发中,尽量使用主键。、
一旦主键参与到业务逻辑中,后期可能要修改源代码。
好的程序设计满足OCP 原则:对程序的扩展是open的,对修改源码是close的。
2.1.3主键生成策略
2.1.3.1 Hibernate 的主键生成策略
在实际开发中一般不容许用户手动设置主键,一般将主键交给数据库,手动编写程序进行设置,在Hibernate中为减少程序编写,提供了很多种主键的生成策略。
< hibernate- mapping>
< ! -- 建立类与表的影射-- >
< ! -- 当类名与表名同名时,可省略表名的映射-- >
< class name = "com.sunlong.hibernate01.domain.Custom" table= "cst_customer" >
< ! -- 建立类中的属性与表中的主键对应-- >
< id name