简单讲述Hibernate实例
创始人
2024-06-07 22:31:54
0

在向大家详细介绍Hibernate实例之前,首先让大家了解下Hibernate提供了多种生成主键的方式,然后全面介绍Hibernate实例。

Hibernate(目前使用的版本是3.2)中提供了多种生成主键的方式。然而当前的这么多种生成方式未必能满足我们的要求。比如increment,可以在一个Hibernate实例的应用上很方便的时候,但是在集群的时候就不行了。再如 identity ,sequence ,native 是数据局提供的主键生成方式,往往也不是我们需要,而且在程序跨数据库方面也体现出不足。还有基于算法的生成方式生成出来的主键基本都是字符串的。

我们现在需要一种生成方式:使用Long作为主键类型,自动增,支持集群。那么我们需要自定义一个我们的主键生成器才能实现了。

Hibernate实例代码:

  1. package hibernate;  
  2.  
  3. import java.io.Serializable;  
  4. import java.sql.Connection;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.util.Properties;  
  9.  
  10. import org.apache.commons.logging.Log;  
  11. import org.apache.commons.logging.LogFactory;  
  12. import org.hibernate.HibernateException;  
  13. import org.hibernate.MappingException;  
  14. import org.hibernate.dialect.Dialect;  
  15. import org.hibernate.engine.SessionImplementor;  
  16. import org.hibernate.id.Configurable;  
  17. import org.hibernate.id.IdentifierGenerator;  
  18. import org.hibernate.id.PersistentIdentifierGenerator;  
  19. import org.hibernate.type.Type;  
  20.  
  21. public class IncrementGenerator implements IdentifierGenerator, Configurable {  
  22. private static final Log log = LogFactory.getLog(IncrementGenerator.class);  
  23. private Long next;  
  24. private String sql;  
  25. public Serializable generate(SessionImplementor session, Object object)  
  26. throws HibernateException {  
  27. if (sql!=null) {  
  28. getNext( session.connection() );  
  29. }  
  30. return next;  
  31. }  
  32.  
  33. public void configure(Type type, Properties params, Dialect d) 
    throws MappingException {  
  34. String table = params.getProperty("table");  
  35. if (table==null) table = params.
    getProperty(PersistentIdentifierGenerator.TABLE);  
  36. String column = params.getProperty("column");  
  37. if (column==null) column = params.
    getProperty(PersistentIdentifierGenerator.PK);  
  38. String schema = params.getProperty
    (PersistentIdentifierGenerator.SCHEMA);  
  39. sql = "select max("+column +") from " + 
    schema==null ? table : schema + '.' + table );  
  40. log.info(sql);  
  41. }  
  42.  
  43. private void getNext(Connection conn) throws HibernateException {  
  44. try {  
  45. PreparedStatement st = conn.prepareStatement(sql);  
  46. ResultSet rs = st.executeQuery();  
  47. if ( rs.next() ) {  
  48. next = rs.getLong(1) + 1;  
  49. }  
  50. else {  
  51. next = 1l;  
  52. }  
  53. }catch(SQLException e)  
  54. {  
  55. throw new HibernateException(e);  
  56. }  
  57. finally {  
  58. try{  
  59. conn.close();  
  60. }catch(SQLException e)  
  61. {  
  62. throw new HibernateException(e);  
  63. }  
  64. }  
  65. }  

配置:
在对应的hbm文件里面将id的配置如下:

  1.  name="id" type="long" column="id" > 
  2.  class="hibernate.IncrementGenerator" /> 
  3.  

【编辑推荐】

  1. Hibernate连接配置方法剖析
  2. Hibernate Session实例剖析
  3. 浅析Hibernate Callback接口
  4. Hibernate Session缓存概述
  5. Hibernate修改addMate方法

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...