天生我才

常用链接

统计

最新评论

Hibernate中的主键释疑

hibernate的配置文件字段是必备的,刚刚看的时候一直疑惑,id字段是怎么和数据库表关联的,为什么一定得给表一个额外的字段?

其实,java语言按内存地址来识别或区分一个类的不同对象,而关系数据库按主键值来区分同一个表的不同记录,hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系,为保证OID的唯一性,应让hibernate而不是应用程序为其赋值。

作为主键的字段必须不为空,不允许重复,主键值永不改变。可以使用具有业务含义的字段作为主键,如COSTOMERS表中的name,但需要满足上述条件,称为自然主键;也有一种代理主键,不具备业务含义,一般取名为ID。ID通常为整数类型,可以定义成自动增长的标识符类型(increment,sequence)。

讲到这里,还得提一下java语言按内存地址区分不同对象,也就是==和equals( ),

    Customer c1=new Customer("oscar");
    Customer c2=new Customer("oscar");
  
   c1= =c2           返回false
   c1.equals(c2)   返回true

现在我们回过头来再看下Hibernate的OID

        Transaction tx=session.beginTranscation();
        Customer c1=(Customer) session.load(Customer.class, new long(1));
        Customer c2=(Customer) session.load(Customer.class, new long(1));
        Customer c3=(Customer) session.load(Customer.class, new long(3));
        System.out.println(c1= =c2);
        System.out.println(c1= =c3);

(1)第一次加载OID为1的对象时,是先从数据库中查询ID为1的记录,再创建相应的Customer实例,保存在Session缓存中,最后把这个对象的引用赋值给变量c1。
(2)第二次加载OID为1时,直接把缓存中的Customer对象赋值给c2。
(3)第三持加载OID为3的对象,由于缓存中不存在,必须再次从数据库读取,然后将Customer实例赋值给c3。

因而输出,true         
                    false

最后提一下Hibernate的内置标识符生成器,increment递增,identity,由底层数据库负责ID,sequence,也是由底层数据库负责,hilo, 按high/low的算法来生成,native,能自动判断底层数据库提供的生成标识符的机制。

posted on 2005-09-20 20:15 天生我才 阅读(242) 评论(0)  编辑  收藏 所属分类: Hibernate


只有注册用户登录后才能发表评论。


网站导航: