本文向大家介绍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. 安装并配置Apache

    从今天开始,我将开始Web开发的学习.本系列博客将陆续记录我学习过程中的收获和困惑,从前端到后端,一探Web开发的流程和内容.我目前掌握的有C/C++,有一些使用C进行嵌入式开发的经验,C++就马马虎 ...

  2. eclipse 下,使用正常模式可以运行,DEBUG模式就卡住的解决方案

    最近开发的时候遇到一个问题,就是用运行就可以编译整个项目,但是使用debug模式就卡住了,编译一部分就不动了.开始我以为是项目太大的关系 但是也不至于就DEBUG不行,所以网上差了些资料,原来是DEB ...

  3. 深入浅出HTTP协议

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发布和接 ...

  4. .net 4.0 中的特性总结(三):垃圾回收

    1.内存基础知识 每个进程都有其自己单独的虚拟地址空间. 同一台计算机上的所有进程共享相同的物理内存,如果有页文件,则也共享页文件. 默认情况下,32 位计算机上的每个进程都具有 2 GB 的用户模式 ...

  5. celery_01 _celery安装启动

    简介:celery是一个分布式队列的管理工具,提供了快速管理和操作分布式任务队列的一些方法的框架 特点:1.celery易于使用和维护,不需要进行很复杂的配置,简单的celery例子: from ce ...

  6. 几种Android数据序列化方案

    一.引言 数据的序列化在Android开发中占据着重要的地位,无论是在进程间通信.本地数据存储又或者是网络数据传输都离不开序列化的支持.而针对不同场景选择合适的序列化方案对于应用的性能有着极大的影响. ...

  7. Redis客户端管理工具的安装及使用

    1.下载及安装 请到官网下载:www.treesoft.cn,要最新的版本treeNMS, window系统下载直接解压,就可以用了,免安装,免布署. 2.登录及连接参数配置 登录后,要配置连接参数信 ...

  8. 如何维持App拥护登录状态(仅仅理论)

    这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: 一:服务端默认的session 这种方式最大的优点是服务端不用增加任 ...

  9. [leetcode-575-Distribute Candies]

    Given an integer array with even length, where different numbers in this array represent different k ...

  10. tomcat7的web.xml的xml片段与注解资源的发现处理逻辑

    1.metadata-complete 属性 Servlet 3.0 的部署描述文件 web.xml 的顶层标签 <web-app> 有一个 metadata-complete 属性,该属 ...