1、 Hibernate的开发流程
<1>、由Domain objectàmappingàdb。(官方推荐)
<2>、由DB开始,用工具生成mapping和 Domain object。(使用很多)
<3>、由映射文件开始。
2、 Domain Object限制
<1>、默认的构造方法(必须的)。
<2>、有无意义的标示符id(主键)(可选)。
<3>、非final的,对懒加载有影响(可选)。
例如:
publicclass User {
intid;
String name;
Date birthday;
getter/setter……
}
3、 Hibernate中持久化类需要遵循四条主要的规则(对第二条的补充)
<1>、为属性字段声明setter和getter方法:Hibernate默认使用protected或private的get/set方法对,字段不需要声明为public。
<2>、实现一个默认的无参构造方法(constructor):所有的持久化类都必须有一个默认的构造方法(可以不是public),这样Hibernate就可以使用Constructor.newInstance()来实例化它们了。
<3>、提供一个标识属性(identifier property):该属性映射数据库表的主键字段。该属性可以叫任何名字,其类型可以是任何原始类型、原始类型的包装类型、String或者Date。标识符属性是可选的。
<4>、使用非final的类:代理是Hibernate的一个重要的功能,它依赖的条件是,持久化类要么是非final的,要么实现一个所有方法都声明为public的接口。
4、 Hibernate映射文件就是用于说明java对象与哪个表中的记录相对应,以及java对象中的各个属性分别对应表中的哪一列,不同性质的属性(例如,主键和普通属性)用不同的标签来映射,如果java对象中的某个属性不需要存储在数据库中,那么在Hibernate映射文件就不需要配置这个属性!
5、 域模型的配置文件
<?xmlversion="1.0"?>
<hibernate-mapping
package="com.fei.hibernate.domain">
<classname="User" table=”user”>
<idname="id" column=”id”>
<generatorclass="native"/> //主键id是通过此标签产生的
</id>
<propertyname="name"></property>
<propertyname="birthday"/>
</class>
</hibernate-mapping>
6、 大家也可以这么简单理解,由于Session可以管理多个数据库表所对应的多个实体对象,如果要查询id为1的实体对象,Session.get()方法需要知道去从哪个数据库表中查询id为1的记录,所以,除了给get方法传递所要查询的实体对象的id值外,还必须给get方法传递实体对象的类型,get方法才能知道去哪个数据库表中进行查询!
7、懒加载load()与get()的区别:
load()方法是在加载一个对象的时候自己产生了一个本类的子类对象,所以加载的对象不可能为null,它是在第一次使用的时候才会去访问数据库。
get()方法是在访问时直接去数据库取数据,不会产生代理对象。
8、 save()与persist()方法的区别:
save()方法是在没有事务的时候,是先将数据插入数据库再回滚删除了数据;
persist()方法在没有事务的时候,是不会将数据插入数据库的(即不会产生insert语句),直接回滚删除了数据。
但在有事务的时候,两者的功能相同。
9、 evict方法和lock方法的用法:
evict方法可以将session中的某对象清除出session,如session.evict(emp)。
lock方法可以加上某种形式的锁以便更新或读写,如session.lock(emp, LockMode.UPGRADE)。
merge()方法是将游离对象变为持久对象的方法