一对多映射有两种,一种是单向的,另一种的多向。我们一般是使用双向的,所以我就写写一对多的双向映射。

还是想昨天一样举个例子来说明:作者《===》作品,还是对数据进行增删改查。

我们一般是把外键建立在多方的,一个作者对应多个作品。

这个前一篇的差不多。我就主要写写有差异的地方吧!

还是要建立数据库表,

  1. create table t_author(
  2. id bigint primary key auto_increment,
  3. authorName varchar(20)
  4. );
  5.  
  6. create table t_book(
  7. id bigint primary key auto_increment,
  8. bookName varchar(20),
  9. fk_author_id int
  10. );

实体:

Author.java

  1. package com.cy.beans;
  2.  
  3. import java.io.Serializable;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6.  
  7. public class Author implements Serializable {
  8. private static final long serialVersionUID = 1L;
  9.  
  10. private long id;
  11. private String authorName;
  12. private Set<Book> books=new HashSet<Book>();
  13.  
  14. public Author(){
  15.  
  16. }
  17.  
  18. public long getId() {
  19. return id;
  20. }
  21.  
  22. public void setId(long id) {
  23. this.id = id;
  24. }
  25.  
  26. public String getAuthorName() {
  27. return authorName;
  28. }
  29.  
  30. public void setAuthorName(String authorName) {
  31. this.authorName = authorName;
  32. }
  33.  
  34. public Set<Book> getBooks() {
  35. return books;
  36. }
  37.  
  38. public void setBooks(Set<Book> books) {
  39. this.books = books;
  40. }
  41.  
  42. @Override
  43. public String toString() {
  44. return "Author [id=" + id + ", authorName=" + authorName +
  45. ", books=" + books + "]";
  46. }
  47.  
  48. }

Book.java

  1. package com.cy.beans;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Book implements Serializable {
  6.  
  7. private static final long serialVersionUID = 1L;
  8.  
  9. private long id;
  10. private String bookName;
  11. private Author author;
  12. public long getId() {
  13. return id;
  14. }
  15. public void setId(long id) {
  16. this.id = id;
  17. }
  18. public String getBookName() {
  19. return bookName;
  20. }
  21. public void setBookName(String bookName) {
  22. this.bookName = bookName;
  23. }
  24. public Author getAuthor() {
  25. return author;
  26. }
  27. public void setAuthor(Author author) {
  28. this.author = author;
  29. }
  30. @Override
  31. public String toString() {
  32. return "Book [id=" + id + ", bookName=" + bookName + ", author="
  33. + author + "]";
  34. }
  35.  
  36. }

持久层和业务层都与之前的差不多。

主要映射文件有所改变:

主对象:Author.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping>
  7.  
  8. <class name="com.cy.beans.Author" table="t_author" catalog="j2ee"> <!-- catalog数据库 -->
  9.  
  10. <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
  11. <column name="id"></column><!-- 此行的ID,为表字段ID -->
  12. <generator class="increment"></generator><!-- 给id指定生成策略 -->
  13. </id>
  14.  
  15. <property name="authorName" type="java.lang.String">
  16. <column name="authorName"></column>
  17. </property>
  18.  
  19. <!--lazy :lazy是延时的意思,如果lazy=true,那么就是说数据库中关联子表的信息在hibernate容器启动的时候不会加载,而是在你真正的访问到字表非标识字段的时候,才会去加载。
  20. 反之,如果lazy=false的话,就是说,子表的信息会同主表信息同时加载
  21. Hibernate3.x,lazy默认是true;
  22. -->
  23. <!-- inverse:hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系 -->
  24.  
  25. <set name="books" table="t_book" cascade="all" inverse="true" lazy="false"><!-- set映射节点 -->
  26. <key column="fk_author_id"></key><!-- 外键 -->
  27. <one-to-many class="com.cy.beans.Book"/><!--one-to-mang节点 -->
  28. </set>
  29. </class>
  30.  
  31. </hibernate-mapping>

从对象:Book.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.cy.beans.Book" table="t_book" catalog="j2ee"> <!-- catalog数据库 -->
  7.  
  8. <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
  9. <column name="id"></column><!-- 此行的ID,为表字段ID -->
  10. <generator class="increment"></generator><!-- 给id指定生成策略 -->
  11. </id>
  12.  
  13. <property name="bookName" type="java.lang.String">
  14. <column name="bookName"></column>
  15. </property>
  16. <!-- access:属性值读取方式field, property
  17. 1,property:这是默认值,表明hibernate通过set和get方法来访问类的属性。这是优先的推荐方式。你必须为这个属性设置get和set方法,hibernate才能访问到。否则会报错的。
  18. 2,field:表明hibernate通过java的反射机制直接访问类的属性。你可以不给这个属性设置get和set属性。 、
  19. fk_author_id :字段名;
  20. not-null :外键不为空
  21. author :many-to-one
  22. -->
  23. <many-to-one name="author" class="com.cy.beans.Author" cascade="none" access="property" column="fk_author_id" not-null="true"></many-to-one>
  24. </class>
  25. </hibernate-mapping>

在hibernate.cfg.xml里添加

  1. <mapping resource="com/cy/xmls/Book.hbm.xml"/>
  2. <mapping resource="com/cy/xmls/Author.hbm.xml"/>

测试:

  1. package com.cy.action;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. import com.cy.beans.Author;
  7. import com.cy.beans.Book;
  8. import com.cy.beans.Person;
  9. import com.cy.server.IAuthorServer;
  10. import com.cy.server.IPersonServer;
  11. import com.cy.server.impl.AuthorServerImpl;
  12. import com.cy.server.impl.PersonServerImpl;
  13.  
  14. public class AuthorAction {
  15.  
  16. public static void main(String[] args) {
  17. // saveAuthor(); 添加
  18. updateAuthor();//修改
  19. }
  20.  
  21. private static void updateAuthor() {
  22. IAuthorServer ps=new AuthorServerImpl();
  23. Author p=ps.getAuthor(Author.class, Long.valueOf(1));//查询
  24. p.setAuthorName("1111");
  25. ps.updateAuthor(p);
  26.  
  27. /*Hibernate:
  28. select
  29. author0_.id as id1_2_0_,
  30. author0_.authorName as authorNa2_2_0_
  31. from
  32. j2ee.t_author author0_
  33. where
  34. author0_.id=?
  35.  
  36. 如果在Author.hbm.xml里没有设置lazy="false",那么下面这个select就不会执行
  37. Hibernate:
  38. select
  39. books0_.fk_author_id as fk_autho3_2_0_,
  40. books0_.id as id1_3_0_,
  41. books0_.id as id1_3_1_,
  42. books0_.bookName as bookName2_3_1_,
  43. books0_.fk_author_id as fk_autho3_3_1_
  44. from
  45. j2ee.t_book books0_
  46. where
  47. books0_.fk_author_id=?
  48.  
  49. Hibernate:
  50. update
  51. j2ee.t_author
  52. set
  53. authorName=?
  54. where
  55. id=?
  56. Hibernate:
  57. update
  58. j2ee.t_book
  59. set
  60. bookName=?,
  61. fk_author_id=?
  62. where
  63. id=?*/
  64.  
  65. }
  66.  
  67. private static void saveAuthor() {
  68. Author a = new Author();
  69. Book b1 = new Book();
  70. Book b2 = new Book();
  71.  
  72. a.setAuthorName("kitty");
  73. b1.setBookName("book1");
  74. b2.setBookName("book2");
  75.  
  76. IAuthorServer server = new AuthorServerImpl();
  77. Set<Book> books = new HashSet<Book>();
  78. books.add(b2);
  79. books.add(b1);
  80. b1.setAuthor(a);
  81. b2.setAuthor(a);
  82. a.setBooks(books);
  83. server.saveAuthor(a);
  84.  
  85. /*Hibernate:
  86. select
  87. max(id)
  88. from
  89. t_author
  90. Hibernate:
  91. select
  92. max(id)
  93. from
  94. t_book
  95. Hibernate:
  96. insert
  97. into
  98. j2ee.t_author
  99. (authorName, id)
  100. values
  101. (?, ?)
  102. Hibernate:
  103. insert
  104. into
  105. j2ee.t_book
  106. (bookName, fk_author_id, id)
  107. values
  108. (?, ?, ?)
  109. Hibernate:
  110. insert
  111. into
  112. j2ee.t_book
  113. (bookName, fk_author_id, id)
  114. values
  115. (?, ?, ?)*/
  116.  
  117. }
  118. }

Hibernate关联关系映射之一对多双向映射的更多相关文章

  1. hibernate 映射<五>多对多双向映射

    多对多映射,可以分单向映射和双向映射.无论是单向还是多向那一方维护,还是双方维护,生成的表结构是一样的. 订单order和产品product是对多对的关系,就是多个订单可以对应多个产品,多个产品也可以 ...

  2. hibernate 映射<四>多对一双向映射

    学生和班级的例子来说,多个学生可以对应一个班级. 1.站在学生角度来说,学生就是多端.那么我们可以通过多对一来维护2者的关系. 2.站在班级的角度来说,班级就是一端.那么我们可以通过一对多啦维护2者的 ...

  3. Hibernate关联关系映射

    1.  Hibernate关联关系映射 1.1.  one to one <class name="Person"> <id name="id" ...

  4. Hibernate(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我 们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看 ...

  5. Hibernate(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...

  6. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

  7. Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...

  8. Hibernate 关联关系映射实例

    双向多对一/一对多(many-to-one/one-to-many) 例子,多个学生对应一个班级,一个班级对应多个学生: 班级类,Grade.java: public class Grade { pr ...

  9. Hibernate学习笔记(四)关系映射之一对一关联映射

    一. 一对一关联映射 ²        两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²        有两种策略可以实现一对一的关联映射 Ø        主键关联:即让 ...

随机推荐

  1. Android 如何通过浏览器打开App

    首先给出参考资料http://my.oschina.net/liucundong/blog/354029?p=3#rpl_291191828 通过浏览器直接打开Android应用程序 Android ...

  2. codeforce 489d bfs分层处理

    这个题确实没想到用bfs进行分层处理,后来看到了大佬的题解之后才想到了这一点 bfs dfs早就学了,可是还是不大会应用到这上面 可以分为三层,起始点,中间点,尾点,需要的数据是中间点到尾点的访问次数 ...

  3. ASP.NET Web API 框架研究 ASP.NET 路由

    ASP.NET Web API 如果采用Web Host方式来寄宿,在请求进入Web API 消息处理管道之前,就会用ASP.NET 自身的路由系统根据注册的路由表,解析出当前请求的HttpContr ...

  4. 利用C#迭代器的一个杨辉三角示例

    身边有个朋友在跟着廖雪峰的教程学习python,途中遇到了"在Python中使用迭代器打印杨辉三角"的问题,我在帮忙解决的同时顺手写了个简单的C#版本以供补充. internal ...

  5. UC浏览器 - 不负责任思考

    前言 UC浏览器的辉煌应该是我读大学(2008年)的时候,转眼间,十年过去了,庆幸的是UC还在,我从使用者变成了一名UC的员工. 以下都是个人的不负责任的猜想或者思考 变更 塞班时代 UC浏览器的地位 ...

  6. 一步步改造wcf,数据加密传输-匿名客户端加密传输

    一步步改造wcf,数据加密传输-匿名客户端加密传输 百度搜索wcf加密传输,资料挺多,真真正正能用的确不多. 一是本来就很复杂,而是各位大神给的资料不足.本人今天来提供一个简易方法. 匿名客户端加密传 ...

  7. 背水一战 Windows 10 (48) - 控件(集合类): FlipView

    [源码下载] 背水一战 Windows 10 (48) - 控件(集合类): FlipView 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类) FlipView 示例Fl ...

  8. 【javascript】您好, 您要的ECMAScript6速记套餐到了 (一)

    [前言]本文“严重参考” 自阮一峰老师写的ES6文档,在此我郑重感谢他沉默无声的帮助 总结一下ES6为 javascript中的 对象/数组/函数 这JS三巨头所提供的更简洁优雅的书写方式,以及扩展的 ...

  9. InfluxDB配置文件详解

    全局配置 # 该选项用于上报influxdb的使用信息给InfluxData公司,默认值为false reporting-disabled = false # 备份恢复时使用,默认值为8088 bin ...

  10. Java - 基础起步

    package basics; //声明该类所在的包为basics,package为包的关键字 import java.util.Date; //导入java.util包中的Date类,用来封装当前的 ...