本文向大家介绍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. ES6 常用总结——第一章(简介、let、const)

    ES6整理 1. ECMAScript 6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准.它的目标,是使得 JavaScript 语言可以用来编写复杂 ...

  2. Vulkan Tutorial 17 Rendering and presentation

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Setup 这一章节会把之前的所有内容进行整合.我们将会编写drawFrame函数, ...

  3. ionic 项目中添加modal的步骤流程

    1.首先在templates文件夹下面定义一个新页面,xxx.html,template文件夹在空项目里面是没有的,需要手动添加一个,放在WWW文件夹下面. <ion-modal-view> ...

  4. 关于MATLAB处理大数据坐标文件2017624

    经过一个下午找资料,已作出人工轨迹记录程序,这样就可以增加样本容量 接下来三个方向:特征.决策树.机械轨迹程序 虽然机械轨迹的程序相对好做,但是现有机械轨迹程序太过于死板,不能自行更改轨迹

  5. go语言获取变量的数据类型

    package main import "fmt" import "reflect"; var y string = "sdasd" fun ...

  6. sublime 设置字体

    通过菜单Preferences/Settings - User,添加下面这行配置就可以修改字体: "font_face": "Courier New", &qu ...

  7. 一起学习c++11——c++11中的新语法

    c++11新语法1: auto关键字 c++11 添加的最有用的一个特性应该就是auto关键字. 不知道大家有没有写过这样的代码: std::map<std::string, std::vect ...

  8. VS2015 +Qt5 串口工具

    简单的小工具是VS2015 + Qt5.6.1实现的,界面部分是Qt实现,串口是封装的WinAPI,把串口收发模块封装成了个Serialport.dll 供Qt界面调用. 由于VS2015需要CRT运 ...

  9. eclipse 配置ssh

    用maven 新建工程 ,然后在src 下面的main 文件夹下新建 java文件夹,在src新建test 文件夹,然后再在下面新建java文件夹然后在pom.xml中引入ssh的依赖, 最后在res ...

  10. peoplesoft function PSTREENODE 通过 deptid 获得部门树 全路径 名称

    create or replace function getUnitFullName(deptid in varchar) return varchar2 is r ); c int; n ); m ...