Hibernate:视图映射

本文介绍如何使用Hibernate映射跨数据库视图,包括创建视图、生成POJO类及配置文件的过程。针对视图无主键的问题提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然Hibernate提供的HQL可以实现多表联合查询,但是我们一般都是将多表查询直接创建为一个视图,直接查询视图就可以了。那么Hibernate怎样映射视图呢?

在网上找了一篇较实用的文章现分享给大家。

文章链接:http://blog.youkuaiyun.com/kingkuang2006/article/details/6981974


由于项目(ssh)有需求根据关键字查询位于同一服务器下不同数据库的2张表t_navi和t_news,由于涉及到分页查询,故不想自己手动去写sql语句来实现跨表查询,不但麻烦而且容易写错,所以想用Hibernate视图来完成该功能,因此上网查看了一些资料,并最终完美解决,故将解决方案记录如下:

一、首先创建一个跨数据库视图

mysql>create view db_cms.search_view as(select * from db_cms.t_navi)union all(select* from db_news.t_news);

注:由于t_navi 和 t_news两张表字段数量和意义完全相同,所以这里使用了union all;

二、生成POJO类和Hibernate配置文件

如果怕自己容易写错,可以使用Myeclipse通过视图反向生成POJO类和**.hbm.xml,如果通过Myeclipse生成的话,将生成如下几个文件:

SearchView.java SearchViewId.java SearchView.hbm.xml

1、SearchView.java

  1. publicclassSearchViewimplementsSerializable{
  2. /**
  3. *
  4. */
  5. privatestaticfinallongserialVersionUID=-1372050399492830775L;
  6. privateSearchViewIdid;
  7. publicSearchViewIdgetId(){
  8. returnid;
  9. }
  10. publicvoidsetId(SearchViewIdid){
  11. this.id=id;
  12. }
  13. }

2、SearchViewId.java

  1. publicclassSearchViewIdimplementsSerializable{
  2. privatestaticfinallongserialVersionUID=-2960868353091674237L;
  3. privateIntegerid;
  4. privateStringnaviTitle;
  5. privateBooleannaviShow=true;
  6. privateBooleantreeShow=true;
  7. privateBooleanjumpHref=false;
  8. privateBooleanwindowOpen=false;
  9. privateIntegerauditStatus;
  10. privateDatecreateDate;
  11. privateDateupdateDate;
  12. privateStringcontent;
  13. privateStringaccessPath;
  14. privateStringjumpHrefUrl;
  15. publicIntegergetId(){
  16. returnid;
  17. }
  18. publicvoidsetId(Integerid){
  19. this.id=id;
  20. }
  21. publicStringgetNaviTitle(){
  22. returnnaviTitle;
  23. }
  24. publicvoidsetNaviTitle(StringnaviTitle){
  25. this.naviTitle=naviTitle;
  26. }
  27. publicBooleangetNaviShow(){
  28. returnnaviShow;
  29. }
  30. publicvoidsetNaviShow(BooleannaviShow){
  31. this.naviShow=naviShow;
  32. }
  33. publicBooleangetTreeShow(){
  34. returntreeShow;
  35. }
  36. publicvoidsetTreeShow(BooleantreeShow){
  37. this.treeShow=treeShow;
  38. }
  39. publicBooleangetJumpHref(){
  40. returnjumpHref;
  41. }
  42. publicvoidsetJumpHref(BooleanjumpHref){
  43. this.jumpHref=jumpHref;
  44. }
  45. publicBooleangetWindowOpen(){
  46. returnwindowOpen;
  47. }
  48. publicvoidsetWindowOpen(BooleanwindowOpen){
  49. this.windowOpen=windowOpen;
  50. }
  51. publicIntegergetAuditStatus(){
  52. returnauditStatus;
  53. }
  54. publicvoidsetAuditStatus(IntegerauditStatus){
  55. this.auditStatus=auditStatus;
  56. }
  57. publicDategetCreateDate(){
  58. returncreateDate;
  59. }
  60. publicvoidsetCreateDate(DatecreateDate){
  61. this.createDate=createDate;
  62. }
  63. publicDategetUpdateDate(){
  64. returnupdateDate;
  65. }
  66. publicvoidsetUpdateDate(DateupdateDate){
  67. this.updateDate=updateDate;
  68. }
  69. publicStringgetContent(){
  70. returncontent;
  71. }
  72. publicvoidsetContent(Stringcontent){
  73. this.content=content;
  74. }
  75. publicStringgetAccessPath(){
  76. returnaccessPath;
  77. }
  78. publicvoidsetAccessPath(StringaccessPath){
  79. this.accessPath=accessPath;
  80. }
  81. publicStringgetJumpHrefUrl(){
  82. returnjumpHrefUrl;
  83. }
  84. publicvoidsetJumpHrefUrl(StringjumpHrefUrl){
  85. this.jumpHrefUrl=jumpHrefUrl;
  86. }
  87. }

3、SearchView.hbm.xml

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  3. <hibernate-mappingpackage="org.bgi.cms.domain">
  4. <classname="SearchView"table="search_view">
  5. <spanstyle="color:#ff0000;"><composite-idname="id"class="SearchViewId">
  6. </span><key-propertyname="id"type="integer">
  7. <columnname="id"/>
  8. </key-property>
  9. <key-propertyname="naviTitle"type="string">
  10. <columnname="navi_title"length="255"/>
  11. </key-property>
  12. <key-propertyname="naviShow"type="yes_no">
  13. <columnname="is_navi_show"/>
  14. </key-property>
  15. <key-propertyname="treeShow"type="yes_no">
  16. <columnname="is_tree_show"/>
  17. </key-property>
  18. <key-propertyname="jumpHref"type="yes_no">
  19. <columnname="is_jump_href"/>
  20. </key-property>
  21. <key-propertyname="windowOpen"type="yes_no">
  22. <columnname="is_window_open"/>
  23. </key-property>
  24. <key-propertyname="auditStatus"type="integer">
  25. <columnname="audit_status"/>
  26. </key-property>
  27. <key-propertyname="createDate"type="timestamp">
  28. <columnname="create_date"/>
  29. </key-property>
  30. <key-propertyname="updateDate"type="timestamp">
  31. <columnname="update_date"/>
  32. </key-property>
  33. <key-propertyname="content"type="text">
  34. <columnname="content"/>
  35. </key-property>
  36. <key-propertyname="jumpHrefUrl"type="string">
  37. <columnname="jump_href_url"length="255"/>
  38. </key-property>
  39. <key-propertyname="accessPath"type="string">
  40. <columnname="access_path"length="45"/>
  41. </key-property>
  42. <spanstyle="color:#ff0000;"></composite-id>
  43. </span></class>
  44. </hibernate-mapping>

注:由于视图是没有主键的,所以Myeclipse生成的hbm.xml配置文件会将所有字段放在一起当做联合主键,这样做有一个问题就是,一旦视图中某个字段为null的话,该条数据在做查询时是查不出来的,所以现在暂时还不能完全确定可以使用该配置文件(如果这些联合主键中的所有字段都是不能为空的话就没有问题,完全可以放心的使用工具生成的改配置文件),因为在我的项目中,视图中的content、jumpHrefUrl以及accessPath字段都是可以为空的,所以需要修改这3个文件,如下:

1、SearchView.java红色的为修改的

  1. publicclassSearchViewimplementsSerializable{
  2. /**
  3. *
  4. */
  5. privatestaticfinallongserialVersionUID=-1372050399492830775L;
  6. privateSearchViewIdid;
  7. <spanstyle="color:#ff0000;">privateStringcontent;
  8. privateStringaccessPath;
  9. privateStringjumpHrefUrl;
  10. </span>
  11. publicSearchViewIdgetId(){
  12. returnid;
  13. }
  14. publicvoidsetId(SearchViewIdid){
  15. this.id=id;
  16. }
  17. <spanstyle="color:#ff0000;">publicStringgetContent(){
  18. returncontent;
  19. }
  20. publicvoidsetContent(Stringcontent){
  21. this.content=content;
  22. }
  23. publicStringgetAccessPath(){
  24. returnaccessPath;
  25. }
  26. publicvoidsetAccessPath(StringaccessPath){
  27. this.accessPath=accessPath;
  28. }
  29. publicStringgetJumpHrefUrl(){
  30. returnjumpHrefUrl;
  31. }
  32. publicvoidsetJumpHrefUrl(StringjumpHrefUrl){
  33. this.jumpHrefUrl=jumpHrefUrl;
  34. }
  35. </span>}
2、 SearchViewId.java红色的为修改的
  1. publicclassSearchViewIdimplementsSerializable{
  2. privatestaticfinallongserialVersionUID=-2960868353091674237L;
  3. privateIntegerid;
  4. privateStringnaviTitle;
  5. privateBooleannaviShow=true;
  6. privateBooleantreeShow=true;
  7. privateBooleanjumpHref=false;
  8. privateBooleanwindowOpen=false;
  9. privateIntegerauditStatus;
  10. privateDatecreateDate;
  11. privateDateupdateDate;
  12. <spanstyle="color:#ff0000;">//privateStringcontent;
  13. //privateStringaccessPath;
  14. //privateStringjumpHrefUrl;
  15. </span>
  16. publicIntegergetId(){
  17. returnid;
  18. }
  19. publicvoidsetId(Integerid){
  20. this.id=id;
  21. }
  22. publicStringgetNaviTitle(){
  23. returnnaviTitle;
  24. }
  25. publicvoidsetNaviTitle(StringnaviTitle){
  26. this.naviTitle=naviTitle;
  27. }
  28. publicBooleangetNaviShow(){
  29. returnnaviShow;
  30. }
  31. publicvoidsetNaviShow(BooleannaviShow){
  32. this.naviShow=naviShow;
  33. }
  34. publicBooleangetTreeShow(){
  35. returntreeShow;
  36. }
  37. publicvoidsetTreeShow(BooleantreeShow){
  38. this.treeShow=treeShow;
  39. }
  40. publicBooleangetJumpHref(){
  41. returnjumpHref;
  42. }
  43. publicvoidsetJumpHref(BooleanjumpHref){
  44. this.jumpHref=jumpHref;
  45. }
  46. publicBooleangetWindowOpen(){
  47. returnwindowOpen;
  48. }
  49. publicvoidsetWindowOpen(BooleanwindowOpen){
  50. this.windowOpen=windowOpen;
  51. }
  52. publicIntegergetAuditStatus(){
  53. returnauditStatus;
  54. }
  55. publicvoidsetAuditStatus(IntegerauditStatus){
  56. this.auditStatus=auditStatus;
  57. }
  58. publicDategetCreateDate(){
  59. returncreateDate;
  60. }
  61. publicvoidsetCreateDate(DatecreateDate){
  62. this.createDate=createDate;
  63. }
  64. publicDategetUpdateDate(){
  65. returnupdateDate;
  66. }
  67. publicvoidsetUpdateDate(DateupdateDate){
  68. this.updateDate=updateDate;
  69. }
  70. <spanstyle="color:#ff0000;">//</span><spanstyle="color:#ff0000;">publicStringgetContent(){
  71. //returncontent;
  72. //}
  73. //
  74. //publicvoidsetContent(Stringcontent){
  75. //this.content=content;
  76. //}
  77. //
  78. //publicStringgetAccessPath(){
  79. //returnaccessPath;
  80. //}
  81. //
  82. //publicvoidsetAccessPath(StringaccessPath){
  83. //this.accessPath=accessPath;
  84. //}
  85. //
  86. //publicStringgetJumpHrefUrl(){
  87. //returnjumpHrefUrl;
  88. //}
  89. //
  90. //publicvoidsetJumpHrefUrl(StringjumpHrefUrl){
  91. //this.jumpHrefUrl=jumpHrefUrl;
  92. //}
  93. </span>}
3、 SearchView.hbm.xml红色的为修改的
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  3. <hibernate-mappingpackage="org.bgi.cms.domain">
  4. <classname="SearchView"table="search_view">
  5. <composite-idname="id"class="SearchViewId">
  6. <key-propertyname="id"type="integer">
  7. <columnname="id"/>
  8. </key-property>
  9. <key-propertyname="naviTitle"type="string">
  10. <columnname="navi_title"length="255"/>
  11. </key-property>
  12. <key-propertyname="naviShow"type="yes_no">
  13. <columnname="is_navi_show"/>
  14. </key-property>
  15. <key-propertyname="treeShow"type="yes_no">
  16. <columnname="is_tree_show"/>
  17. </key-property>
  18. <key-propertyname="jumpHref"type="yes_no">
  19. <columnname="is_jump_href"/>
  20. </key-property>
  21. <key-propertyname="windowOpen"type="yes_no">
  22. <columnname="is_window_open"/>
  23. </key-property>
  24. <key-propertyname="auditStatus"type="integer">
  25. <columnname="audit_status"/>
  26. </key-property>
  27. <key-propertyname="createDate"type="timestamp">
  28. <columnname="create_date"/>
  29. </key-property>
  30. <key-propertyname="updateDate"type="timestamp">
  31. <columnname="update_date"/>
  32. </key-property>
  33. </composite-id>
  34. <spanstyle="color:#ff0000;"><propertyname="content"column="content"type="text"/>
  35. <propertyname="jumpHrefUrl"column="jump_href_url"type="string"length="255"/>
  36. <propertyname="accessPath"column="access_path"type="string"length="45"/>
  37. </span></class>
  38. </hibernate-mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值