本文向大家介绍Hibernate实例一对多的情况,可能好多人还不了解Hibernate实例一对多,没有关系,下面通过一个实例来帮助您理解Hibernate实例一对多,希望本文能教会你更多东西。

先看由满江红翻译团队(RedSaga Translate Team)翻译的一对多配置说明,然后在看例子
一对多关联(One-to-many Associations)

一对多关联 通过外键 连接两个类对应的表,而没有中间集合表。 这个关系模型失去了一些Java集合的语义:

一个被包含的实体的实例只能被包含在一个集合的实例中

一个被包含的实体的实例只能对应于集合索引的一个值中

一个从Product到Part的关联需要关键字字段,可能还有一个索引字段指向Part所对应的表。标记指明了一个一对多的关联。

  1. <one-to-many
  2. class="ClassName"                                  (1)
  3. not-found="ignore|exception"                       (2)
  4. entity-name="EntityName"                           (3)
  5. node="element-name"
  6. embed-xml="true|false"
  7. />

(1) class(必须):被关联类的名称。 
(2) not-found (可选 - 默认为exception): 指明若缓存的标示值关联的行缺失,该如何处理: ignore 会把缺失的行作为一个空关联处理。 
(3) entity-name (可选): 被关联的类的实体名,作为class的替代。 
例子

  1. <set name="bars">
  2. <key column="foo_id"/>
  3. <one-to-many class="org.hibernate.Bar"/>
  4. set

注意:元素不需要定义任何字段。 也不需要指定表名。

重要提示

如果Hibernate实例一对多关联中的外键字段定义成NOT NULL,你必须把映射声明为not-null="true",或者使用双向关联,并且标明inverse="true"。

1 先建表

  1. create   table  student
  2. (sid  varchar ( 32 )  not   null   primary   key ,
  3. sname  varchar ( 16 ),
  4. sage  varchar ( 16 ),
  5. )
  6. create   table  book
  7. (bid  varchar ( 32 )  not   null   primary   key ,
  8. bname  varchar ( 16 ),
  9. bprice  varchar ( 16 ),
  10. sid  varchar ( 32 )
  11. )

2.写vo Student.java

  1. package com.test;
  2. import java.util.Set;
  3. public class Student
  4. {
  5. private String sid;
  6. private String sname;
  7. private String sage;
  8. private Set book;
  9. public Student()
  10. {
  11. }
  12. // 写上get set

Book.JAVA

  1. package com.test;
  2. public class Book
  3. {
  4. private String bid;
  5. private String bname;
  6. private String bprice;
  7. public Book()
  8. {
  9. }
  10. //写上get set

3.写对应的映射文件Student.hbm.xml

  1. xml version="1.0"?>
  2. PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  4. <hibernate-mapping>
  5. <class name="com.test.Student" table="student" >
  6. <id name="sid" type="string" unsaved-value="null" >
  7. <column name="sid" sql-type="char(32)" not-null="true"/>
  8. <generator class="uuid.hex"/>
  9. id
  10. <property name="sname">
  11. <column name="sname" sql-type="varchar(16)" not-null="true"/>
  12. property
  13. <property name="sage">
  14. <column name="sage" sql-type="varchar(16)" not-null="true"/>
  15. property
  16. <set name="book" cascade="all" outer-join="true">
  17. <key column="sid"/>
  18. <one-to-many class="com.test.Book" />
  19. set
  20. class
  21. hibernate-mapping

Book.hbm.xml

  1. xml version="1.0"?>
  2. PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  4. <hibernate-mapping>
  5. <class name="com.test.Book" table="book" >
  6. <id name="bid" type="string" unsaved-value="null" >
  7. <column name="bid" sql-type="char(32)" not-null="true"/>
  8. <generator class="uuid.hex"/>
  9. id
  10. <property name="bname">
  11. <column name="bname" sql-type="varchar(16)" not-null="true"/>
  12. property
  13. <property name="bprice">
  14. <column name="bprice" sql-type="varchar(16)" not-null="true"/>
  15. property
  16. class
  17. hibernate-mapping

接着把下面的hibernate.properties文件拷到classes目录下。。这里用的是mysql

  1. hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
  2. ## MySQL
  3. hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
  4. hibernate.connection.driver_class org.gjt.mm.mysql.Driver
  5. hibernate.connection.url jdbc:mysql://localhost:3306/wjcms
  6. hibernate.connection.username root
  7. hibernate.connection.password wujun
  8. hibernate.connection.pool_size 1
  9. hibernate.proxool.pool_alias pool1
  10. hibernate.show_sql true
  11. hibernate.jdbc.batch_size 0
  12. hibernate.max_fetch_depth 1
  13. hibernate.cache.use_query_cache true

4.写测试类了..

    1. package com.test;
    2. import net.sf.hibernate.Session;
    3. import net.sf.hibernate.SessionFactory;
    4. import net.sf.hibernate.cfg.Configuration;
    5. import net.sf.hibernate.*;
    6. import java.util.Set;
    7. import java.util.HashSet;
    8. import java.sql.*;
    9. import java.util.List;
    10. import java.util.Iterator;
    11. public class TestOneToMany
    12. {
    13. SessionFactory sf;
    14. Session session;
    15. public TestOneToMany()
    16. {
    17. try
    18. {
    19. Configuration cfg = new Configuration();
    20. sf = cfg.addClass(Student.class).addClass(Book.class).buildSessionFactory();
    21. }
    22. catch(HibernateException ex)
    23. {
    24. ex.printStackTrace();
    25. }
    26. }
    27. //插入
    28. public void doCreate()
    29. {
    30. try
    31. {
    32. session = sf.openSession();
    33. Student student = new Student();
    34. student.setSname("小王");
    35. student.setSage("22");
    36. Set bookSet = new HashSet();
    37. Book book = null;
    38. for(int i=0;i<2;i++)
    39. {
    40. book = new Book();
    41. book.setBname("java "+i);
    42. book.setBprice("50");
    43. bookSet.add(book);
    44. }
    45. student.setBook(bookSet);
    46. session.save(student);
    47. session.flush();
    48. session.connection().commit();
    49. }
    50. catch(HibernateException ex)
    51. {
    52. ex.printStackTrace();
    53. }
    54. catch(SQLException ex1)
    55. {
    56. ex1.printStackTrace();
    57. }
    58. finally
    59. {
    60. try{
    61. session.close();
    62. }
    63. catch(HibernateException ex2){
    64. }
    65. }
    66. }
    67. //查询
    68. public void doQuery()
    69. {
    70. try{
    71. session = sf.openSession();
    72. Query q = session.createQuery("select s from Student as s");
    73. List l = q.list();
    74. Student s = null;
    75. Book book = null;
    76. for(int i=0;i<l.size();i++)
    77. {
    78. s = (Student)l.get(i);
    79. System.out.println("姓名: "+s.getSname());
    80. System.out.println("年龄: "+s.getSage());
    81. System.out.println("所有的书:");
    82. Iterator it = s.getBook().iterator();
    83. while(it.hasNext())
    84. {
    85. book = (Book)it.next();
    86. System.out.println("书名: "+book.getBname());
    87. System.out.println("价格: "+book.getBprice());
    88. }
    89. }
    90. }
    91. catch(HibernateException ex){
    92. ex.printStackTrace();
    93. }
    94. finally{
    95. try{
    96. session.close();
    97. }
    98. catch(HibernateException ex2){
    99. }
    100. }
    101. }
    102. public static void main(String[] args)
    103. {
    104. TestOneToMany t = new TestOneToMany();
    105. //t.doCreate();
    106. t.doQuery();
    107. }
    108. }

Hibernate一对多实例的更多相关文章

  1. hibernate 一对多双向关联 详解

    一.解析: 1.  一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...

  2. Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)

    本文知识点(目录): 1.Annotation 注解版(只是测试建表)    2.XML版 的实现(只是测试建表)    3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...

  3. Hibernate一对多配置

    刚刚学习了Hibernate框架的基础知识,下面我来说说关于Hibernate一对多的配置 首先是大配置 连接数据库 用户名 和密码 能和小配置连接 部门小配置: 员工小配置: 部门实体类 员工实体类 ...

  4. Hibernate框架搭建实例

    一,Hibernate是一个持久层,是一个专门负责管理数据库连接的框架: 二,Hibernate的搭建实例: 1.在Hibernate的官方网站(http://www.hibernate.org)可以 ...

  5. Hibernate一对多OnetoMany

    ------------------------Hibernate一对多OnetoMany 要点: 配置在一端. 1.如果是单向关联,即只在一端配置OneToMany,多端不配置ManyToOne.则 ...

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

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

  7. Hibernate一对多操作

    --------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意: ...

  8. Java进阶知识09 Hibernate一对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在一的一方加Set 1.2.创建Customer类和Order类 package com.shore.model; import java.util.Hash ...

  9. (原创)hibernate 一对多建表实例详解 附上各个注释的含义

    这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的 ...

随机推荐

  1. JavaScript概念总结:作用域、闭包、对象与原型链

    1 JavaScript变量作用域 1.1 函数作用域 没有块作用域:即作用域不是以{}包围的,其作用域完成由函数来决定,因而if /for等语句中的花括号不是独立的作用域. 如前述,JS的在函数中定 ...

  2. 从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray)

    从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray) deque deque双端队列,分段连续空间数据结构,由中控的map(与其说map,不如说是数 ...

  3. Django rest framework 自定义Exception

    使用Dango rest framework时,有时需要raise APIException到前端,为了统一错误返回格式,我们需要对exception的格式进行调整. 方法: 1. 在project/ ...

  4. 关于EasyUI中的Tree

    2017年6月21日,天气阴.心情比较沉重. 近期由于毕设的事情,三周不写代码了.这周测试提交了一些BUG,于是开始着手处理,还真的是熟能生巧,三周的功夫就感觉有点生疏.其中有一个BUG就是角色对应的 ...

  5. epoll的ET和LT模式比较 - 源码分析

    eventpoll是一种文件,它实现了一种机制利用一条rdllist队列来避免阻塞地进行poll.eventpoll归根到底还是在使用poll.而ET比LT高效,并不在于是否使用了poll,更不能说是 ...

  6. twisted学习之reactor

    reactor是twisted框架里面一个很重要的抽象,它为我们实现了循环,所以我们不用再去实现循环了. reactor有如下特点: 1.reactor循环会一致运行下去,可以使用Ctrl+C或者相关 ...

  7. android开发中关于继承activity类中方法的调用

    android开发中关于继承activity类中的函数,不能在其他类中调用其方法. MainActivity.java package com.example.testmain; import and ...

  8. Sql_Case_When用法

    http://wenku.baidu.com/link?url=XBnkUzGtiJFhTnQk5HbmdgndhVEYJdcfDEhSEIFeTRn9-41KMLf_49wKiydNCF-4g3Qi ...

  9. 浅谈Cordova框架的一些理解

    前言 因为工作原因,最近需要研究Cordova框架,看了其中的源码和实现方式,当场在看的时候马上能理解,但是事后再回去看相关源码时候却发现之前理解的内容又忘记了,又不得不重新开始看,所以总觉得需要记录 ...

  10. php中的冒泡排序算法

    <?php //php中的冒泡排序算法 //从大到小的排序方式 ,$arr[$j]>$arr[$j+1](这里换成了从小到大的排序方式) $arr=array(); $arr=array( ...