Hibernate一對多實例
本文向大家介紹Hibernate實例一對多的情況,可能好多人還不了解Hibernate實例一對多,沒有關系,下面通過一個實例來幫助您理解Hibernate實例一對多,希望本文能教會你更多東西。
先看由滿江紅翻譯團隊(RedSaga Translate Team)翻譯的一對多配置說明,然后在看例子
一對多關聯(lián)(One-to-many Associations)
一對多關聯(lián) 通過外鍵 連接兩個類對應的表,而沒有中間集合表。 這個關系模型失去了一些Java集合的語義:
一個被包含的實體的實例只能被包含在一個集合的實例中
一個被包含的實體的實例只能對應于集合索引的一個值中
一個從Product到Part的關聯(lián)需要關鍵字字段,可能還有一個索引字段指向Part所對應的表。 
- <one-to-many
 - class="ClassName" (1)
 - not-found="ignore|exception" (2)
 - entity-name="EntityName" (3)
 - node="element-name"
 - embed-xml="true|false"
 - />
 
(1) class(必須):被關聯(lián)類的名稱。 
(2) not-found (可選 - 默認為exception): 指明若緩存的標示值關聯(lián)的行缺失,該如何處理: ignore 會把缺失的行作為一個空關聯(lián)處理。 
(3) entity-name (可選): 被關聯(lián)的類的實體名,作為class的替代。 
例子
- <set name="bars">
 - <key column="foo_id"/>
 - <one-to-many class="org.hibernate.Bar"/>
 - < SPAN>set>
 
注意:
重要提示
如果Hibernate實例一對多關聯(lián)中的外鍵字段定義成NOT NULL,你必須把
1 先建表
- create table student
 - (sid varchar ( 32 ) not null primary key ,
 - sname varchar ( 16 ),
 - sage varchar ( 16 ),
 - )
 - create table book
 - (bid varchar ( 32 ) not null primary key ,
 - bname varchar ( 16 ),
 - bprice varchar ( 16 ),
 - sid varchar ( 32 )
 - )
 
2.寫vo Student.java
- package com.test;
 - import java.util.Set;
 - public class Student
 - {
 - private String sid;
 - private String sname;
 - private String sage;
 - private Set book;
 - public Student()
 - {
 - }
 - // 寫上get set
 
Book.JAVA
- package com.test;
 - public class Book
 - {
 - private String bid;
 - private String bname;
 - private String bprice;
 - public Book()
 - {
 - }
 - //寫上get set
 
3.寫對應的映射文件Student.hbm.xml
- xml version="1.0"?>
 - PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
 - "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
 - <hibernate-mapping>
 - <class name="com.test.Student" table="student" >
 - <id name="sid" type="string" unsaved-value="null" >
 - <column name="sid" sql-type="char(32)" not-null="true"/>
 - <generator class="uuid.hex"/>
 - < SPAN>id>
 - <property name="sname">
 - <column name="sname" sql-type="varchar(16)" not-null="true"/>
 - < SPAN>property>
 - <property name="sage">
 - <column name="sage" sql-type="varchar(16)" not-null="true"/>
 - < SPAN>property>
 - <set name="book" cascade="all" outer-join="true">
 - <key column="sid"/>
 - <one-to-many class="com.test.Book" />
 - < SPAN>set>
 - < SPAN>class>
 - < SPAN>hibernate-mapping>
 
Book.hbm.xml
- xml version="1.0"?>
 - PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
 - "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
 - <hibernate-mapping>
 - <class name="com.test.Book" table="book" >
 - <id name="bid" type="string" unsaved-value="null" >
 - <column name="bid" sql-type="char(32)" not-null="true"/>
 - <generator class="uuid.hex"/>
 - < SPAN>id>
 - <property name="bname">
 - <column name="bname" sql-type="varchar(16)" not-null="true"/>
 - < SPAN>property>
 - <property name="bprice">
 - <column name="bprice" sql-type="varchar(16)" not-null="true"/>
 - < SPAN>property>
 - < SPAN>class>
 - < SPAN>hibernate-mapping>
 
接著把下面的hibernate.properties文件拷到classes目錄下。。這里用的是mysql
- hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
 - ## MySQL
 - hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
 - hibernate.connection.driver_class org.gjt.mm.mysql.Driver
 - hibernate.connection.url jdbc:mysql://localhost:3306/wjcms
 - hibernate.connection.username root
 - hibernate.connection.password wujun
 - hibernate.connection.pool_size 1
 - hibernate.proxool.pool_alias pool1
 - hibernate.show_sql true
 - hibernate.jdbc.batch_size 0
 - hibernate.max_fetch_depth 1
 - hibernate.cache.use_query_cache true
 
4.寫測試類了..
- package com.test;
 - import net.sf.hibernate.Session;
 - import net.sf.hibernate.SessionFactory;
 - import net.sf.hibernate.cfg.Configuration;
 - import net.sf.hibernate.*;
 - import java.util.Set;
 - import java.util.HashSet;
 - import java.sql.*;
 - import java.util.List;
 - import java.util.Iterator;
 - public class TestOneToMany
 - {
 - SessionFactory sf;
 - Session session;
 - public TestOneToMany()
 - {
 - try
 - {
 - Configuration cfg = new Configuration();
 - sf = cfg.addClass(Student.class).addClass(Book.class).buildSessionFactory();
 - }
 - catch(HibernateException ex)
 - {
 - ex.printStackTrace();
 - }
 - }
 - //插入
 - public void doCreate()
 - {
 - try
 - {
 - session = sf.openSession();
 - Student student = new Student();
 - student.setSname("小王");
 - student.setSage("22");
 - Set bookSet = new HashSet();
 - Book book = null;
 - for(int i=0;i<2;i++)
 - {
 - book = new Book();
 - book.setBname("java "+i);
 - book.setBprice("50");
 - bookSet.add(book);
 - }
 - student.setBook(bookSet);
 - session.save(student);
 - session.flush();
 - session.connection().commit();
 - }
 - catch(HibernateException ex)
 - {
 - ex.printStackTrace();
 - }
 - catch(SQLException ex1)
 - {
 - ex1.printStackTrace();
 - }
 - finally
 - {
 - try{
 - session.close();
 - }
 - catch(HibernateException ex2){
 - }
 - }
 - }
 - //查詢
 - public void doQuery()
 - {
 - try{
 - session = sf.openSession();
 - Query q = session.createQuery("select s from Student as s");
 - List l = q.list();
 - Student s = null;
 - Book book = null;
 - for(int i=0;i<l.size();i++)
 - {
 - s = (Student)l.get(i);
 - System.out.println("姓名: "+s.getSname());
 - System.out.println("年齡: "+s.getSage());
 - System.out.println("所有的書:");
 - Iterator it = s.getBook().iterator();
 - while(it.hasNext())
 - {
 - book = (Book)it.next();
 - System.out.println("書名: "+book.getBname());
 - System.out.println("價格: "+book.getBprice());
 - }
 - }
 - }
 - catch(HibernateException ex){
 - ex.printStackTrace();
 - }
 - finally{
 - try{
 - session.close();
 - }
 - catch(HibernateException ex2){
 - }
 - }
 - }
 - public static void main(String[] args)
 - {
 - TestOneToMany t = new TestOneToMany();
 - //t.doCreate();
 - t.doQuery();
 - }
 - }
 
好了。。在這里把這些例子幾下來。。方便查閱。。也是很適合象我們這樣的出學者。。。
【編輯推薦】















 
 
 

 
 
 
 