一个持久化类需要遵循四条主要的规则:
1:实现一个默认的即无参数的构造方法(为了通过反射机制来实例化这个类对象);
2:提供一个标识属性(主键),(可选);
3:使用非final的类(可选);
4:为持久化字段声明访问器和是否可变的标志(可选)
持久化字段不需要声明问public的,hibernate可以持久化一个有default、protected、private的get/set方法对的属性进行持久化
如果有如下需求,则必须重载equals()和hashCode()方法
1:想把持久类的实例放如Set中(当表示多值关联时,推荐这样做)
2:想重用托管实例
建议使用业务键值相等来实现equals()和hashCode()。对选择业务键来说,不可变或唯一的属性是不错的选择
hibernate仅对那些持久化对象赋标识值,一个新创建的实例将不会有任何标识值
映射文档是按照持久化类的定义来创建的,而非表的定义
当映射文件中没有column attribute属性的时候,hibernate缺省地使用属性名作为字段名
一个Session代表一个单线程的单元操作,SessionFactory则是个线程安全的全局对象,只需要被实例化一次。SessionFactory可以创建并打开新的Session。
创建SessionFactory:
SessionFactory sessionFactory;
sessionFactory = new Configuration().configure().buildSessionFactory();
如果在配置文件中给SessionFactory一个名字,在SessionFactory创建后,Hibernate会试着把他绑定到JNDI
当事务结束的时候,不管是提交还是回滚,Hibernate会自动把Session从当前的线程剥离,并且关闭它
假设在A表映射文件中定义一个到B表的多对多关联,对于多对多的关联,需要在<set>里定义<many-to-many>元素,需要一个关联表,表里面的每一行代表从A表到B表的一个关联,表名是由set元素的table属性配置的,关联表里面的标识符字段名,对A表的一端,是由<key>元素定义的,而B表一端的字段名是由<many-to-many>元素的column属性定义,在<many-to-many>元素中还需要定义关联的另一端(B表)所对应的类,具体如下所示:
<set name="AtoB" table="A_B">
<key column="A_ID"/>
<many-to-many column="B_ID" class="package.B"/>
<set>
把一个双向关联的一端设置为inverse将告诉Hibernate忽略关联的这一端,把这端看成是另外一端的一个镜象,所有的双向关联都需要有一端被设置为inverse,在一对多的关联中它必须是代表多的那端,而在多对多的关联中,你可以任意选取一端
sessions.openSession() 会从连接池获得一个JDBC连接
只要没有hibernate.connection.pool_size属性在配置文件中,就关闭了Hibernate自带的连接池
Hibernate可以持久化一个有default、protected或private的get/set方法对的属性进行持久化
映射文档是按照持久化类的定义来创建的,而非表的定义
Hibernate Session设计是非线程安全的,一个Session实例同时只可由一个线程使用
Query和Criteria是Hibernate的数据查询接口,提供了对查询条件的查询机制,Query面向HQL和Native SQL,而Criteria则提供了面向对象的查询模式。