Hibernate一对多实例

本文向大家介绍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. }
时间: 2024-10-17 23:16:44

Hibernate一对多实例的相关文章

菜鸟学习Hibernate——一对多关系映射

Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创建实体类Classes和实体类Student Classes.java package com.bjpowernode.hibernate; import java.util.Set; public class Classes { private int id; private String nam

hibernate 一对多关联关系(详细分析)

在领域模型中, 类与类之间最普遍的关系就是关联关系. 在 UML 中, 关联是有方向的. 以 Customer 和 Order 为例: 一个用户能发出多个订单, 而一个订单只能属于一个客户. 从 Order 到 Customer 的关联是多对一关联; 而从 Customer 到 Order 是一对多关联 单向关联 双向关联 单向 n-1 单向 n-1 关联只需从 n 的一端可以访问 1 的一端 域模型: 从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Cus

Hibernate一对多操作

--------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意:这里的客户是公司级的,即 公司,联系人 即 公司里的员工 (一)一对多映射配置 第一步:创建两个实体类,客户和联系人 第二步:让两个实体类之间互相表示 (1)在客户实体类中表示多个联系人 (2)在联系人实体类中表示所属客户 第三步:配置映射关系 「一般一个实体类对应一个映射配置文件」 (1)配置基本

Hibernate一对多、多对一关联

一对多.多对一关联:在多方加外键 示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group   多对一单向关联 在User(多方)中建Group(一方)对象,并添加@ManyToOne注解 1.建Group实体类和User实体类,添加Annotation注解,如下 @Entity @Table(name="_group") //group在MySQL中是关键字,不能直接做表名 public class Group { privat

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

一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同时加载多的一端的数据 多对一关联映射是指在加载多的一端数据的同时加载一的一端的数据 而单向一对多关联映射是在一的一端维护关系的,具有以下的缺点: 必须先保存多的一端后才可以保存一的一端,所以在保存多的一端时多的一端不知道一的一端是否 存在相应的数据,所以只能将维护的关系字段设置为null,如果为非空

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

这个是hibernate的一对多建表实例:一的一端是部门(Department),对的一端是员工(Employee),下面贴上成员源代码:其中@mappedBy是加在@OneToMany一端,并且它的name属性=多的那一端(N端)属性是一的那一端的属性名,mappedBy是定义在Department类中,即Department类不负责维护级联关系.即维护者是Employee类 Department类: package com.javabean; import java.io.Serializa

Hibernate 一对多注解 实例

student: /** * */ package com.wonders.task.sample.bo; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persisten

Hibernate一对多关联关系保存时的探究

在以前使用hibernate时,经常对保存存在关联关系的对象时,不确定是否能保存成功.    因此,特意对一对多关系的2个对象进行实践. 一.pojo类和配置文件的准备 这里有一点提前说一下,外键列在数据库中并没有设置为不为null.因此可以出现外键为空的情况. (1)pojo类     (2)映射文件      (3)测试类中方法的准备 二.双方都维护关联关系且双向关联 注意:这里的双向关联是指双向都建立关系 (1)1方和多方都保存,且建立了双向关联的关系.这样是肯定可以保存成功的. (2)1

03.Hibernate一对多关联

前言:在域模型中,类与类之间最普遍的关系就是关联关系,在UML语言中关联关系是有方向的.在数据库中表与表之间也会有关联关系,本节介绍通过Hibernate映射一对多的关联关系,这是一种最普遍的关联关系. 1.数据库表的一对多关联关系 (1)示例数据库表说明 本节使用两张表:tb_student(学生表).tb_class(班级表),一个班级里有多个学生,而一个学生只能在一个班级里,这样构成了学生与班级的多对一关联关系.下图表述了Student与Class之间的关系: (2)使用MySQL创建表