本文向大家介绍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. htm语言的语法基础及规则

    HTML的主要语法是元素和标签.元素是符合DTD(文档类型定义)的文档组成部分,如title(文档标题).IMG(图象).table(表格)等等.元素名不区分大小写的.HTML用标签来规定元素的属性和 ...

  2. C++构造函数(二)

    本篇是介绍C++的构造函数的第二篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 复制构造函数 复制构造函数是构造函数的一种,也被称为拷贝构造函数,他只有一个参数,参数类型是本类的引用.默认构 ...

  3. 浅尝JavaScript document对象

    document对象 每个载入浏览器的 HTML 文档都会成为 Document 对象.document 对象是HTML文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点).Docu ...

  4. winform / Dev全局皮肤组件

    话不多说先上效果图. 由于这是单独的测试项目, 用于演示Dev控件的皮肤样式, 所以上面只是演示了部分控件的效果. 下面则是一些实际项目中的截图: Dev的控件样式不仅美观丰富, 上面仅皮肤设置就有4 ...

  5. Linux: 安装和启用firefox浏览器的java

    之前在linux服务器上浏览一个网页时必须启用java才可以,但是自己只是一个服务器的普通用户,并没有root权限,所以只能把java装在自己的目录下面,因此不能用rpm包,而必须从Oracal官网下 ...

  6. SVG制作简单的图形

    圆形 circle <svg width="200" height="200" > <circle cx="100" cy ...

  7. MySQL各模块工作配合

    MySQL各模块工作配合 在了解了 MySQL 的各个模块之后,我们再看看 MySQL 各个模块间是如何相互协同工作的 .接下来,我们通过启动 MySQL,客户端连接,请求 query,得到返回结果, ...

  8. WPF 杂谈——Trigger触发器

    笔者在使用的WPF过程中,见过的触发器有三种:Trigger.DataTrigger.EventTrigger.其中最为常用的要属Trigger.至于触发器的作用就是当某个属性的值发生变化,应该去做某 ...

  9. JavaScript学习笔记(一)——初识js

    这个周,开始了JavaScript的学习路程.虽然从高中开始就接触了网页设计的知识,大学里的学习也算回顾了Html和Css的知识,实习期间在牛盾科技也是做的网站建设,不过通过前段时间找工作才发现自己了 ...

  10. 记一次redis挂机导致的服务雪崩事故~不对,是故事

    事故时常有,最近特别多!但每次事故总会有人出来背锅!如果不是自己的锅,解决了对自己是一种成长,如果是自己的锅,恐怕锅大了,就得走人了,哈哈哈... 这不,最近又出了一个锅:从周五开始,每天到11点就不 ...