hibernate自定義主鍵策略 – JAVA編程語言程序開發技術文章

 hibernate自定義主鍵策略,
最近項目中使用hibernate的guid生成策略,配置如下:
<id name=”id” type=”java.lang.String”>
            <column name=”ID” length=”32″ />
            <generator class=”guid” />
</id>
發現生成的id很有規律,一看源碼原來hibernate的guid底層使用采用數據庫底層的guid算法機制,對應MYSQL的uuid()函數,SQL


Server的newid()函數,ORACLE的rawtohex(sys_guid())函數等。



具體oracle使用的是(select rawtohex(sys_guid()) from dual)
使用下面的pl/sql測試:



declare
  v varchar2(32);
begin
  for i in 0..10 loop
  select   rawtohex(sys_guid()) into v from dual;
    dbms_output.put_line(v);
  end loop;
end;



結果:
A36190EE69DDAAE7E040200A8A096CE5
A36190EE69DEAAE7E040200A8A096CE5
A36190EE69DFAAE7E040200A8A096CE5
A36190EE69E0AAE7E040200A8A096CE5
A36190EE69E1AAE7E040200A8A096CE5
A36190EE69E2AAE7E040200A8A096CE5
A36190EE69E3AAE7E040200A8A096CE5
A36190EE69E4AAE7E040200A8A096CE5
A36190EE69E5AAE7E040200A8A096CE5
A36190EE69E6AAE7E040200A8A096CE5
A36190EE69E7AAE7E040200A8A096CE5
隻有中間一個字符不同。


下面采用hibernate自定id策略接口IdentifierGenerator
我們簡單起見使用jdk自帶的uuid方法:


 


public class UUIDGenerator implements IdentifierGenerator{


 private static Logger logger = Logger.getLogger(UUIDGenerator.class);
 
 public Serializable generate(SessionImplementor session, Object object)
   throws HibernateException {
  String id = UUID.randomUUID().toString().replaceAll(“-“, “”).toUpperCase();
 
  return id;
 }


}



然後在配置的時候用如下配置即可:


<id name=”id” type=”java.lang.String”>
            <column name=”ID” length=”32″ />
            <generator class=”com.XXX.XXX.UUIDGenerator” />
</id>
~完~


 

發佈留言