您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Hibernate 实体关联关系映射--学习总结
1Hibernate实体关联关系映射----总结收集整理:Volunteer2009年11月16日星期一版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。引言花了三天的业余时间,终于写完了Hibernate关联关系映射的所有实例,感觉还应该总结一下。Hibernate映射关系错综复杂,在实际中真的都能用到吗?不用行吗?在我看来,Hibernate提供这些映射关系,常用就是一对一和多对一,并且在能不用连接表的时候尽量不要用连接表。多对多会用到,如果用到了,应该首先考虑底层数据库设计是否合理。在实际开发中,在Hibernate关联关系之外常常还有另外一种选择方案,表各自作为单表映射,业务逻辑控制外键关系(有时候就是一个相关联的列,但不一定要加外键约束),这样更加灵活,并且数据的完整性同样有保证。当然,“单表映射,业务控制外键关系”并不是说Hibernate的实体关联功能是多余的,Hibernate的实体关联的优点很多,随便拿本书都是讲优点,用好了会让开发人员感觉更方便,现在我也是两种方案结合使用。比如对于不很确定的两个实体,常常选用单表关联。以前在初学Hibernate还没有完全搞清楚这些关联关系的时候,就是用单表映射,业务控制外键关系做的,发现没有任何问题,程序同样运行得很好。看了这些是不是后悔浪费时间学习映射关系了?呵呵,Hibernate的ORMapping是Hibernate的灵魂,我相信Hibernate的创始人比我们一般人的理解更深刻。只有学会了这些才能体会Hibernate设计者的思想。学一个东西,不光自己写代码,还应该能看懂别人的代码才行。因此系统学习这些关联映射还是大有必要的。以上都是我自己的观点。欢迎在此交流讨论。Hibernate在实际项目开发中,hbm.xml包括数据库脚本都是通过Xdoclet生成的,在此不采用Xdoclet的目的是为了便于理解这些映射模型。实体-数据表-映射文件三者对比看,太直观了。瞌睡了,暂时先写到此,有新思路了再补上。。。。2Hibernate关联关系映射实例速查Hibernate的映射关系很多,也比较复杂,也很容易忘记。这个基本上占据了Hibernate学习的七成时间。熟悉这些映射模型,需要大量的实践才能掌握。下面是我对Hibernate关联关系映射的一个总结,放到blog上一是自己查看方便,二来也可以和更多Hibernate开发人员交流分享。希望各位多多留言哦:)。本文主要参考夏昕翻译的“Hibernate参考文档V3.12”,也在附件中给出了。1.本文的模块较多,映射关系部分分为一下模块:Hibernate关联关系映射目录│├─单向关联│├─一对一外键单向关联│├─一对一主键单向关联│├─一对一连接表单向关联│├─一对多外键单向关联│├─一对多连接表单向关联│├─多对一外键单向关联│├─多对一连接表单向关联│└─多对多单向关联└─双向关联├─一对一外键双向关联├─一对一主键双向关联├─一对一连接表双向关联├─一对多外键双向关联├─一对多连接表双向关联└─多对多双向关联2.本系列实例的开发环境:WindowsXPProfessional简体中文版MySQL5.0.45Hibernate3.12JavaSDK1.5.06IntelliJIDEA5.123.系列实例中所用的Hibernate配置文件如下:?xmlversion='1.0'encoding='gb2312'?!DOCTYPEhibernate-configurationPUBLIC-//Hibernate/HibernateConfigurationDTD3.0//EN[url][/url]hibernate-configurationsession-factory!--指定连接数据库驱动--propertyname=connection.driver_classcom.mysql.jdbc.Driver/property!--指定连接数据库的url,hibernate连接的数据库名--propertyname=connection.urljdbc:mysql://localhost:3306/hbstudy/property!--指定连接数据库的用户名--propertyname=connection.usernameroot/property!--指定连接数据库的用户密码--propertyname=connection.passwordleizhimin/property!--指定连接池的大小--propertyname=connection.pool_size5/property!--指定数据库的方言--propertyname=dialectorg.hibernate.dialect.MySQLDialect/property!--根据需要自动创建数据库,测试环境用--propertyname=hbm2ddl.autocreate/property!--在控制台显示执行的SQL语句--propertyname=show_sqltrue/property!--EnableHibernate'sautomaticsessioncontextmanagement--propertyname=current_session_context_classthread/property!--映射文件列表--!--单向关联--mappingresource=com/lavasoft/dx/_n_1_fk/Addressn1fk.hbm.xml/mappingresource=com/lavasoft/dx/_n_1_fk/Personn1fk.hbm.xml/mappingresource=com/lavasoft/dx/_n_1_tab/Addressn1tab.hbm.xml/mappingresource=com/lavasoft/dx/_n_1_tab/Personn1tab.hbm.xml/mappingresource=com/lavasoft/dx/_1_1_fk/Address11fk.hbm.xml/mappingresource=com/lavasoft/dx/_1_1_fk/Person11fk.hbm.xml/mappingresource=com/lavasoft/dx/_1_1_tab/Address11tab.hbm.xml/mappingresource=com/lavasoft/dx/_1_1_tab/Person11tab.hbm.xml/mappingresource=com/lavasoft/dx/_1_1_pk/Address11pk.hbm.xml/mappingresource=com/lavasoft/dx/_1_1_pk/Person11pk.hbm.xml/mappingresource=com/lavasoft/dx/_1_n_fk/Address1nfk.hbm.xml/mappingresource=com/lavasoft/dx/_1_n_fk/Person1nfk.hbm.xml/mappingresource=com/lavasoft/dx/_1_n_tab/Address1ntab.hbm.xml/mappingresource=com/lavasoft/dx/_1_n_tab/Person1ntab.hbm.xml/mappingresource=com/lavasoft/dx/_n_n/Addressnn.hbm.xml/mappingresource=com/lavasoft/dx/_n_n/Personnn.hbm.xml/!--双向关联--mappingresource=com/lavasoft/sx/_1_n_fk/Address1nfk_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_n_fk/Person1nfk_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_n_tab/Address1ntab_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_n_tab/Person1ntab_sx.hbm.xml/mappingresource=com/lavasoft/sx/_n_n/Addressnn_sx.hbm.xml/mappingresource=com/lavasoft/sx/_n_n/Personnn_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_1_fk/Address11fk_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_1_fk/Person11fk_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_1_pk/Address11pk_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_1_pk/Person11pk_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_1_tab/Address11tab_sx.hbm.xml/mappingresource=com/lavasoft/sx/_1_1_tab/Person11tab_sx.hbm.xml//session-factory/hibernate-configuration4.系列实例中所用到Session工厂是:publicclassHibernateUtil{privatestaticfinalSessionFactorysessionFactory;static{try{//CreatetheSessionFactoryfromhibernate.cfg.xmlsessionFactory=newConfiguration().configure().buildSessionFactory();}catch(Throwableex){//Makesureyoulogtheexception,asitmightbeswallowedSystem.err.println(初始化SessionFactory失败!+ex);thrownewExceptionInInitializerError(ex);}}publicstaticfinalThreadLocalsession=newThreadLocal();publicstaticSessiongetCurrentSession()throwsHibernateException{Sessions=(Session)session.get();//当原Session为空或已关闭时,打开一个新的Sessionif(s==null||!s.isOpen()){s=sessionFactory.openSession();session.set(s);}returns;}publicstaticvoidcloseSession()throwsHibernateException{Sessions=(Session)session.get();
本文标题:Hibernate 实体关联关系映射--学习总结
链接地址:https://www.777doc.com/doc-4825816 .html