Hibernate持久化类与主键生成策略

来源:互联网 发布:天津市软件学院 编辑:程序博客网 时间:2024/05/17 10:03

一、持久化类
持久化类(Persistent Object)实际上就是POJO+hbm.xml。在Hibernate中,PO的编写规则为:

  1. 提供一个public权限的无参构造;
  2. 对属性进行private声明,并提供public getter/setter;
  3. 在PO中必须提供一个标识符(OID),OID与数据库的主键对应;
  4. PO中尽量使用基本数据类型的包装类(因为包装类默认null,而基本数据类型中,int默认值为0,会对数据存储产生影响,比如存在一个只有0和1取值的flag…);
  5. 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程序负责生成。

0 0
原创粉丝点击