一、持久化类
持久化类(Persistent Object)实际上就是POJO+hbm.xml。在Hibernate中,PO的编写规则为:
- 提供一个public权限的无参构造;
- 对属性进行private声明,并提供public getter/setter;
- 在PO中必须提供一个标识符(OID),OID与数据库的主键对应;
- PO中尽量使用基本数据类型的包装类(因为包装类默认null,而基本数据类型中,int默认值为0,会对数据存储产生影响,比如存在一个只有0和1取值的flag…);
- PO类不能使用final修饰。
———————————–
org.hibernate.Session中存在get和load方法,set方法会得到一个PO对象,是立刻执行查询,如果查询不存在,会返回null;load会得到PO的代理类型的对象,是一种延迟查询的策略,如果查询不存在,会抛出ObjectNotFoundException。
首先写了一个获得session的HibernateUtils,因为创建新的SessionFactory需要耗费大量资源。
package utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static Configuration config;
private static SessionFactory sessionFactory;
static {
config = new Configuration().configure();
sessionFactory = config.buildSessionFactory();
}
public static Session openSession(){
return sessionFactory.openSession();
}
}
演示get和load方法的不同
package test;
import org.hibernate.Session;
import org.junit.Test;
import domain.Customer;
import utils.HibernateUtils;
public class HibernateTest {
@Test
public void test1(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//get
Customer customer1 = session.get(Customer.class, 5);
System.out.println(customer1.getClass()+"------------"+customer1.getId());
//load
Customer customer2 = session.load(Customer.class, 6);
System.out.println(customer2.getClass()+"------------"+customer2.getId());
session.getTransaction().commit();
session.close();
}
}
结果是
二、Hibernate主键生成策略
Hibernate中的主键分为自然主键和代理主键。自然主键是将具有业务含义的字段作为主键,代理主键是将不具备业务含义的字段作为主键。
increment:每次生成主键时自动递增。如果有多个应用访问一个数据库,可能产生主键冲突。
identity:根据mysql等的自动增长主键生成。
sequence:根据oracle等数据库生成的标识符。
native:根据底层数据库来自动选择,效率比较低。
uuid:采用128bit的UUID算法生成的标识符,容易保证主键的唯一性,占用空间会相对较大。
assigned:自然主键,由java程序负责生成。