<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 59  文章 - 70  trackbacks - 0
    <2009年1月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    搜索

    •  

    積分與排名

    • 積分 - 173476
    • 排名 - 340

    最新評論

    閱讀排行榜

    評論排行榜

    復合主鍵,由多個字段組成主鍵,例如,使用一個用戶的firstname和lastname組成主鍵。

    可以通過兩種方式確定主鍵,一種是基于實體類的復合主鍵,另一種是通過定義主鍵類來實現。
    不管通過哪種方式,復合主鍵都需要實現equals方法和hashcode方法,以作為不同數據之間是別的標志。

    一.基于實體類屬性的復合主鍵
    主鍵由實體類中的屬性組成。

    1.映射文件TUser.hbm.xml

    xml 代碼
    1. <? xml ? version = "1.0" ?> ??
    2. <!DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN" ??
    3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > ??
    4. < hibernate-mapping > ??
    5. ???? < class ? name = "cn.blogjava.start.TUser" ? table = "t_user" ? catalog = "sample" > ??
    6. ???????? < composite-id > ??
    7. ???????????? < key-property ? name = "lastname" ? column = "lastname" ? type = "string" ? /> ??
    8. ???????????? < key-property ? name = "firstname" ? column = "firstname" ? type = "string" ? /> ??
    9. ???????? </ composite-id > ??
    10. ??
    11. ???????? < property ? name = "age" ? type = "integer" ? column = "age" /> ??
    12. ???? </ class > ??
    13. </ hibernate-mapping > ??

    2.TUser.java

    java 代碼
    1. package ?cn.blogjava.start; ??
    2. ??
    3. import ?org.apache.commons.lang.builder.EqualsBuilder; ??
    4. import ?org.apache.commons.lang.builder.HashCodeBuilder; ??
    5. ??
    6. /** ?
    7. ?*?TUser?generated?by?hbm2java ?
    8. ?*/ ??
    9. ??
    10. public ? class ?TUser? implements ?java.io.Serializable?{ ??
    11. ??
    12. ???? //?Fields???? ??
    13. ??
    14. ???? private ?Integer?age; ??
    15. ??
    16. ???? private ?String?firstname; ??
    17. ??
    18. ???? private ?String?lastname; ??
    19. ??
    20. ???? public ?Integer?getAge()?{ ??
    21. ???????? return ?age; ??
    22. ????} ??
    23. ??
    24. ???? public ? void ?setAge(Integer?age)?{ ??
    25. ???????? this .age?=?age; ??
    26. ????} ??
    27. ??
    28. ???? public ?String?getFirstname()?{ ??
    29. ???????? return ?firstname; ??
    30. ????} ??
    31. ??
    32. ???? public ? void ?setFirstname(String?firstname)?{ ??
    33. ???????? this .firstname?=?firstname; ??
    34. ????} ??
    35. ??
    36. ???? public ?String?getLastname()?{ ??
    37. ???????? return ?lastname; ??
    38. ????} ??
    39. ??
    40. ???? public ? void ?setLastname(String?lastname)?{ ??
    41. ???????? this .lastname?=?lastname; ??
    42. ????} ??
    43. ???? ??
    44. ???? public ? boolean ?equals(Object?obj)?{ ??
    45. ???????? if (!(obj? instanceof ?TUser))?{ ??
    46. ???????????? return ? false ; ??
    47. ????????} ??
    48. ???????? ??
    49. ????????TUser?user?=?(TUser)obj; ??
    50. ???????? return ? new ?EqualsBuilder()?????????? //?EqualsBuilder?和HashCodeBuilder均為apache?common?lang包中的工具類 ??
    51. ????????????.appendSuper( super .equals(obj)) ??
    52. ????????????.append( this .lastname,?user.lastname) ??
    53. ????????????.append( this .firstname,?user.firstname) ??
    54. ????????????.isEquals();???????? ??
    55. ????} ??
    56. ???? ??
    57. ???? public ? int ?hasCode()?{ ??
    58. ???????? return ? new ?HashCodeBuilder(- 528253723 ,?- 475504089 ) ??
    59. ????????????.appendSuper( super .hashCode()) ??
    60. ????????????.append( this .lastname).append( this .firstname) ??
    61. ????????????.toHashCode(); ??
    62. ???????????? ??
    63. ????} ??
    64. ??
    65. }??

    3.測試類HibernateTest.java

    java 代碼
    1. package ?cn.blogjava.start; ??
    2. ??
    3. import ?junit.framework.Assert; ??
    4. import ?junit.framework.TestCase; ??
    5. ??
    6. import ?org.hibernate.HibernateException; ??
    7. import ?org.hibernate.Session; ??
    8. import ?org.hibernate.SessionFactory; ??
    9. import ?org.hibernate.Transaction; ??
    10. import ?org.hibernate.cfg.Configuration; ??
    11. ??
    12. ??
    13. public ? class ?HibernateTest? extends ?TestCase?{ ??
    14. ???? ??
    15. ????Session?session?=? null ; ??
    16. ???? /** ?
    17. ?????*?JUnit中的setUp方法在TestCase初始化的時候會自動調用 ?
    18. ?????*?一般用于初始化公用資源 ?
    19. ?????*/ ??
    20. ???? protected ? void ?setUp()?{ ??
    21. ???????? try ?{ ??
    22. ???????????? /** ?
    23. ?????????????*?可以采用hibernate.properties或者hibernate.cfg.xml ?
    24. ?????????????*?配置文件的初始化代碼 ?
    25. ?????????????*? ?
    26. ?????????????*?采用hibernate.properties ?
    27. ?????????????*?Configuration?config?=?new?Configuration(); ?
    28. ?????????????*?config.addClass(TUser.class); ?
    29. ?????????????*/ ??
    30. ???????????? ??
    31. ???????????? //采用hibernate.cfg.xml配置文件,與上面的方法對比,兩個差異 ??
    32. ???????????? //1.Configuration的初始化方式 ??
    33. ???????????? //2.xml ??
    34. ????????????Configuration?config?=? new ?Configuration().configure(); ??
    35. ????????????SessionFactory?sessionFactory?=?config.buildSessionFactory(); ??
    36. ????????????session?=?sessionFactory.openSession(); ??
    37. ???????????? ??
    38. ????????}? catch ?(HibernateException?e)?{ ??
    39. ???????????? //?TODO:?handle?exception ??
    40. ????????????e.printStackTrace(); ??
    41. ????????}???????? ??
    42. ????} ??
    43. ??
    44. ???? /** ?
    45. ?????*?JUnit中的tearDown方法在TestCase執行完畢的時候會自動調用 ?
    46. ?????*?一般用于釋放資源 ?
    47. ?????*/ ???? ??
    48. ???? protected ? void ?tearDown()?{ ??
    49. ???????? try ?{ ??
    50. ????????????session.close();???????? ??
    51. ????????}? catch ?(HibernateException?e)?{ ??
    52. ???????????? //?TODO:?handle?exception ??
    53. ????????????e.printStackTrace(); ??
    54. ????????}???????? ??
    55. ????}???? ??
    56. ???? ??
    57. ???? /** ?
    58. ?????*?對象持久化測試(Insert方法) ?
    59. ?????*/ ???????? ??
    60. ???? public ? void ?testInsert()?{ ??
    61. ????????Transaction?tran?=? null ; ??
    62. ???????? try ?{ ??
    63. ????????????tran?=?session.beginTransaction(); ??
    64. ????????????TUser?user?=? new ?TUser(); ??
    65. ????????????user.setFirstname( "bai" ); ??
    66. ????????????user.setLastname( "yunfeng" ); ??
    67. ????????????user.setAge( 26 ); ??
    68. ????????????session.save(user); ??
    69. ????????????session.flush(); ??
    70. ????????????tran.commit(); ??
    71. ????????}? catch ?(HibernateException?e)?{ ??
    72. ???????????? //?TODO:?handle?exception ??
    73. ????????????e.printStackTrace(); ??
    74. ????????????Assert.fail(e.getMessage()); ??
    75. ???????????? if (tran?!=? null )?{ ??
    76. ???????????????? try ?{ ??
    77. ????????????????????tran.rollback(); ??
    78. ????????????????}? catch ?(Exception?e1)?{ ??
    79. ???????????????????? //?TODO:?handle?exception ??
    80. ????????????????????e1.printStackTrace(); ??
    81. ????????????????} ??
    82. ????????????} ??
    83. ????????} ??
    84. ????} ??
    85. ???? ??
    86. ???? /** ?
    87. ?????*?對象讀取測試(Select方法) ?
    88. ?????*/ ???????????? ??
    89. ???? public ? void ?testSelect(){ ??
    90. ????????TUser?user?=? new ?TUser(); ??
    91. ????????user.setFirstname( "bai" ); ??
    92. ????????user.setLastname( "yunfeng" ); ??
    93. ???????? ??
    94. ????????user?=?(TUser)session.load(TUser. class ,?user); ??
    95. ????????Assert.assertEquals(user.getAge().intValue(),? 26 ); ??
    96. ????} ??
    97. } ??

    基于主鍵類的復合主鍵:
    方法:將主鍵字段從POJO類中提出了,生成一個主鍵類。
    可以將1中的例子加以改造,將firstname和lastname字段單獨提取到一個主鍵類中。

    1.
    配置文件TUser.hbm.xml
    composite-id節點的name指定了實體類中的主鍵類的屬性名.

    xml 代碼
    1. <? xml ? version = "1.0" ?> ??
    2. <!DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN" ??
    3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > ??
    4. < hibernate-mapping ? package = "cn.blogjava.start" > ??
    5. ???? < class ? name = "TUser" ? table = "t_user" ? catalog = "sample" > ??
    6. ???????? < composite-id ? name = "userPK" ? class = "TUserPK" > ??
    7. ???????????? < key-property ? name = "lastname" ? column = "lastname" ? type = "string" ? /> ??
    8. ???????????? < key-property ? name = "firstname" ? column = "firstname" ? type = "string" ? /> ??
    9. ???????? </ composite-id > ??
    10. ??
    11. ???????? < property ? name = "age" ? type = "integer" ? column = "age" /> ??
    12. ???? </ class > ??
    13. </ hibernate-mapping > ??

    2.POJO類

    1. package ?cn.blogjava.start; ??
    2. ??
    3. /** ?
    4. ?*?TUser?generated?by?hbm2java ?
    5. ?*/ ??
    6. ??
    7. public ? class ?TUser? implements ?java.io.Serializable?{ ??
    8. ??
    9. ???? //?Fields???? ??
    10. ??
    11. ???? private ?Integer?age; ??
    12. ???? ??
    13. ???? //配置文件composite-id的name屬性 ??
    14. ???? private ?TUserPK?userPK; ??
    15. ??
    16. ??
    17. ???? public ?Integer?getAge()?{ ??
    18. ???????? return ?age; ??
    19. ????} ??
    20. ??
    21. ???? public ? void ?setAge(Integer?age)?{ ??
    22. ???????? this .age?=?age; ??
    23. ????} ??
    24. ??
    25. ???? public ?TUserPK?getUserPK()?{ ??
    26. ???????? return ?userPK; ??
    27. ????} ??
    28. ??
    29. ???? public ? void ?setUserPK(TUserPK?userPK)?{ ??
    30. ???????? this .userPK?=?userPK; ??
    31. ????} ??
    32. }??

    3.主鍵類TUserPK.java

    java 代碼
    1. package ?cn.blogjava.start; ??
    2. ??
    3. import ?java.io.Serializable; ??
    4. ??
    5. import ?org.apache.commons.lang.builder.EqualsBuilder; ??
    6. import ?org.apache.commons.lang.builder.HashCodeBuilder; ??
    7. ??
    8. public ? class ?TUserPK? implements ?Serializable?{ ??
    9. ??
    10. ???? private ?String?firstname; ??
    11. ???? private ?String?lastname; ??
    12. ??
    13. ???? public ?String?getFirstname()?{ ??
    14. ???????? return ?firstname; ??
    15. ????} ??
    16. ??
    17. ???? public ? void ?setFirstname(String?firstname)?{ ??
    18. ???????? this .firstname?=?firstname; ??
    19. ????} ??
    20. ??
    21. ???? public ?String?getLastname()?{ ??
    22. ???????? return ?lastname; ??
    23. ????} ??
    24. ??
    25. ???? public ? void ?setLastname(String?lastname)?{ ??
    26. ???????? this .lastname?=?lastname; ??
    27. ????} ??
    28. ???? ??
    29. ???? public ? boolean ?equals(Object?obj)?{ ??
    30. ???????? if (!(obj? instanceof ?TUserPK))?{ ??
    31. ???????????? return ? false ; ??
    32. ????????} ??
    33. ???????? ??
    34. ????????TUserPK?userPK?=?(TUserPK)obj; ??
    35. ???????? return ? new ?EqualsBuilder() ??
    36. ????????????.appendSuper( super .equals(obj)) ??
    37. ????????????.append( this .lastname,?userPK.lastname) ??
    38. ????????????.append( this .firstname,?userPK.firstname) ??
    39. ????????????.isEquals();???????? ??
    40. ????} ??
    41. ???? ??
    42. ???? public ? int ?hasCode()?{ ??
    43. ???????? return ? new ?HashCodeBuilder(- 528253723 ,?- 475504089 ) ??
    44. ????????????.appendSuper( super .hashCode()) ??
    45. ????????????.append( this .lastname).append( this .firstname) ??
    46. ????????????.toHashCode();???????????? ??
    47. ????} ??
    48. } ??

    4.測試代碼HibernateTest.java

    java 代碼
    1. package ?cn.blogjava.start; ??
    2. ??
    3. import ?junit.framework.Assert; ??
    4. import ?junit.framework.TestCase; ??
    5. ??
    6. import ?org.hibernate.HibernateException; ??
    7. import ?org.hibernate.Session; ??
    8. import ?org.hibernate.SessionFactory; ??
    9. import ?org.hibernate.Transaction; ??
    10. import ?org.hibernate.cfg.Configuration; ??
    11. ??
    12. ??
    13. public ? class ?HibernateTest? extends ?TestCase?{ ??
    14. ???? ??
    15. ????Session?session?=? null ; ??
    16. ???? /** ?
    17. ?????*?JUnit中的setUp方法在TestCase初始化的時候會自動調用 ?
    18. ?????*?一般用于初始化公用資源 ?
    19. ?????*/ ??
    20. ???? protected ? void ?setUp()?{ ??
    21. ???????? try ?{ ??
    22. ???????????? /** ?
    23. ?????????????*?可以采用hibernate.properties或者hibernate.cfg.xml ?
    24. ?????????????*?配置文件的初始化代碼 ?
    25. ?????????????*? ?
    26. ?????????????*?采用hibernate.properties ?
    27. ?????????????*?Configuration?config?=?new?Configuration(); ?
    28. ?????????????*?config.addClass(TUser.class); ?
    29. ?????????????*/ ??
    30. ???????????? ??
    31. ???????????? //采用hibernate.cfg.xml配置文件,與上面的方法對比,兩個差異 ??
    32. ???????????? //1.Configuration的初始化方式 ??
    33. ???????????? //2.xml ??
    34. ????????????Configuration?config?=? new ?Configuration().configure(); ??
    35. ????????????SessionFactory?sessionFactory?=?config.buildSessionFactory(); ??
    36. ????????????session?=?sessionFactory.openSession(); ??
    37. ???????????? ??
    38. ????????}? catch ?(HibernateException?e)?{ ??
    39. ???????????? //?TODO:?handle?exception ??
    40. ????????????e.printStackTrace(); ??
    41. ????????}???????? ??
    42. ????} ??
    43. ??
    44. ???? /** ?
    45. ?????*?JUnit中的tearDown方法在TestCase執行完畢的時候會自動調用 ?
    46. ?????*?一般用于釋放資源 ?
    47. ?????*/ ???? ??
    48. ???? protected ? void ?tearDown()?{ ??
    49. ???????? try ?{ ??
    50. ????????????session.close();???????? ??
    51. ????????}? catch ?(HibernateException?e)?{ ??
    52. ???????????? //?TODO:?handle?exception ??
    53. ????????????e.printStackTrace(); ??
    54. ????????}???????? ??
    55. ????}???? ??
    56. ???? ??
    57. ???? /** ?
    58. ?????*?對象持久化測試(Insert方法) ?
    59. ?????*/ ???????? ??
    60. ???? public ? void ?testInsert()?{ ??
    61. ????????Transaction?tran?=? null ; ??
    62. ???????? try ?{ ??
    63. ????????????tran?=?session.beginTransaction(); ??
    64. ????????????TUser?user?=? new ?TUser(); ??
    65. ????????????TUserPK?userPK?=? new ?TUserPK(); ??
    66. ????????????userPK.setFirstname( "yu" ); ??
    67. ????????????userPK.setLastname( "yy" ); ??
    68. ????????????user.setUserPK(userPK); ??
    69. ????????????user.setAge( 25 ); ??
    70. ????????????session.save(user); ??
    71. ????????????session.flush(); ??
    72. ????????????tran.commit(); ??
    73. ????????}? catch ?(HibernateException?e)?{ ??
    74. ???????????? //?TODO:?handle?exception ??
    75. ????????????e.printStackTrace(); ??
    76. ????????????Assert.fail(e.getMessage()); ??
    77. ???????????? if (tran?!=? null )?{ ??
    78. ???????????????? try ?{ ??
    79. ????????????????????tran.rollback(); ??
    80. ????????????????}? catch ?(Exception?e1)?{ ??
    81. ???????????????????? //?TODO:?handle?exception ??
    82. ????????????????????e1.printStackTrace(); ??
    83. ????????????????} ??
    84. ????????????} ??
    85. ????????} ??
    86. ????} ??
    87. ???? ??
    88. ???? /** ?
    89. ?????*?對象讀取測試(Select方法) ?
    90. ?????*/ ???????????? ??
    91. ???? public ? void ?testSelect(){ ??
    92. ????????TUserPK?userPK?=? new ?TUserPK(); ??
    93. ????????userPK.setFirstname( "yu" ); ??
    94. ????????userPK.setLastname( "yy" ); ??
    95. ???????? ??
    96. ????????TUser?user?=?(TUser)session.load(TUser. class ,?userPK); ??
    97. ????????Assert.assertEquals(user.getAge().intValue(),? 25 ); ??
    98. ????} ??
    99. } ??
    posted on 2009-01-05 15:49 JasonChou 閱讀(2955) 評論(0)  編輯  收藏 所屬分類: j2ee
    主站蜘蛛池模板: 亚洲精品美女久久久久| 亚洲人xxx日本人18| 最近2022中文字幕免费视频| 亚洲乱码一二三四区麻豆| 97无码免费人妻超级碰碰碰碰| 婷婷国产偷v国产偷v亚洲| 伊伊人成亚洲综合人网7777| 亚洲精品免费在线| 特级毛片全部免费播放a一级| 亚洲av永久无码精品表情包| 亚洲色图综合网站| 午夜dj在线观看免费视频| 亚洲人成综合在线播放| 午夜国产羞羞视频免费网站| 久久免费福利视频| 亚洲AV一区二区三区四区| 久久久亚洲精品无码| 日本一区免费电影| 98精品全国免费观看视频| 婷婷国产偷v国产偷v亚洲| 亚洲激情校园春色| 久久精品亚洲福利| 免费看片A级毛片免费看| 久久国产精品一区免费下载| 国产精品亚洲二区在线| 日韩亚洲AV无码一区二区不卡| 国产乱子伦精品免费女| 亚洲一区二区三区免费观看 | 亚洲黄色三级网站| 亚洲AV无码一区二区三区国产| 国产免费女女脚奴视频网| 在线免费视频你懂的| 色欲aⅴ亚洲情无码AV蜜桃| 亚洲黄色免费观看| 亚洲精品无码国产| 美丽的姑娘免费观看在线播放| h片在线播放免费高清| 亚洲日韩一区精品射精| 亚洲视频小说图片| 亚洲第一AV网站| 国产av无码专区亚洲国产精品|