Hibernate一對(duì)多實(shí)例
本文向大家介紹Hibernate實(shí)例一對(duì)多的情況,可能好多人還不了解Hibernate實(shí)例一對(duì)多,沒有關(guān)系,下面通過一個(gè)實(shí)例來幫助您理解Hibernate實(shí)例一對(duì)多,希望本文能教會(huì)你更多東西。
先看由滿江紅翻譯團(tuán)隊(duì)(RedSaga Translate Team)翻譯的一對(duì)多配置說明,然后在看例子
一對(duì)多關(guān)聯(lián)(One-to-many Associations)
一對(duì)多關(guān)聯(lián) 通過外鍵 連接兩個(gè)類對(duì)應(yīng)的表,而沒有中間集合表。 這個(gè)關(guān)系模型失去了一些Java集合的語(yǔ)義:
一個(gè)被包含的實(shí)體的實(shí)例只能被包含在一個(gè)集合的實(shí)例中
一個(gè)被包含的實(shí)體的實(shí)例只能對(duì)應(yīng)于集合索引的一個(gè)值中
一個(gè)從Product到Part的關(guān)聯(lián)需要關(guān)鍵字字段,可能還有一個(gè)索引字段指向Part所對(duì)應(yīng)的表。
- <one-to-many
- class="ClassName" (1)
- not-found="ignore|exception" (2)
- entity-name="EntityName" (3)
- node="element-name"
- embed-xml="true|false"
- />
(1) class(必須):被關(guān)聯(lián)類的名稱。
(2) not-found (可選 - 默認(rèn)為exception): 指明若緩存的標(biāo)示值關(guān)聯(lián)的行缺失,該如何處理: ignore 會(huì)把缺失的行作為一個(gè)空關(guān)聯(lián)處理。
(3) entity-name (可選): 被關(guān)聯(lián)的類的實(shí)體名,作為class的替代。
例子
- <set name="bars">
- <key column="foo_id"/>
- <one-to-many class="org.hibernate.Bar"/>
- < SPAN>set>
注意:
重要提示
如果Hibernate實(shí)例一對(duì)多關(guān)聯(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.寫對(duì)應(yīng)的映射文件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.寫測(cè)試類了..
- 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("價(jià)格: "+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();
- }
- }
好了。。在這里把這些例子幾下來。。方便查閱。。也是很適合象我們這樣的出學(xué)者。。。
【編輯推薦】