hibernate naturalid

来源:互联网 发布:飞思卡尔官网编程软件 编辑:程序博客网 时间:2024/06/16 15:26

NaturalId代表自然主键,有别于代理主键<id>;在开发中使用的较少。要使用自然主键,需要修改一下Department的映射文件:

[html] view plain copy
 print?
  1.  <class name="Department">  
  2.         <cache usage="read-write" region="DEPT"/>  
  3.         <id name="id">  
  4.             <generator class="native" />  
  5.         </id>  
  6.         <natural-id>  
  7.             <property name="name" />  
  8.         </natural-id>  
  9.         <set name="emps" lazy="extra" inverse="true">  
  10.             <key column="DEPT_ID" />  
  11.             <one-to-many class="Employee" />  
  12.         </set>  
  13. </class>  

注意一点的就是,natural-id是额外的一个作为自然主键的列,他必须和id同时存在。(貌似自然主键可以单独存在,如sid取题工程Hibernate会为标记为自然主键的属性或多个属性添加UNIQUE约束。

要使用NaturalId,主要是在查询的时候:

[java] view plain copy
 print?
  1. @Test  
  2.     public void testStatistics5() {  
  3.         Session session = HibernateUtil.getInstance().getSession();  
  4.         session.createCriteria(Department.class)  
  5.                 .add(Restrictions.naturalId().set("name""d1"))  
  6.                 .setCacheable(true).setCacheRegion("EMP").uniqueResult();  
  7.         session.close();  
  8.         session = HibernateUtil.getInstance().getSession();  
  9.         session.byNaturalId(Department.class).using("name""d1").load();  
  10.         session.close();  
  11.         Statistics st = HibernateUtil.getInstance().getSf().getStatistics();  
  12.         String[] regions = st.getSecondLevelCacheRegionNames();  
  13.         for (String region : regions) {  
  14.             NaturalIdCacheStatistics ncs = st  
  15.                     .getNaturalIdCacheStatistics(region);  
  16.             System.out.println(ncs);  
  17.         }  
  18.     }  

简单解释一下:

1,要使用自然主键查询,一般有两种方式,一种方式是使用session新提供的byNaturalId方法,该方法需要传入查询对象的类型,并通过using(String propertyName,Object value)来设置要查询的自然主键属性及其值,然后再通过load()方法(立刻查询)或者byReference()方法(延迟加载)来完成对象的查询;第二种方式是通过createCriteriaRestrictions.naturalId约束来查询。

2,自然主键查询一般需要生成2SQL

SELECT id FROM DEPARTMENT WHERE name = ?

SELECT * FROM DEPARTMENT WHERE id = ?

即首先查询出符合自然主键的对象的ID,再通过得到的idload对象。所以,一般情况下,使用自然主键查询对象,都需要开启二级缓存。

3,来看下输出:

[plain] view plain copy
 print?
  1. NaturalIdCacheStatistics[hitCount=0,missCount=0,putCount=0,executionCount=0,executionAvgTime=0,executionMinTime=9223372036854775807,executionMaxTime=0,elementCountInMemory=1,elementCountOnDisk=0,sizeInMemory=2089]  
[plain] view plain copy
 print?
  1. 注意就是在naturalIdCacheStatistics中保存的是NaturalId和对应的对象的ID值。  

了解了以上这些内容,要做一个简单的全面监控Hibernate的模块就是很简单的事情了。

原创粉丝点击