先看由滿江紅翻譯團隊(RedSaga Translate Team)翻譯的一對多配置說明
然后在看例子
?一對多關聯(One-to-many Associations)
一對多關聯
通過外鍵
連接兩個類對應的表,而沒有中間集合表。 這個關系模型失去了一些Java集合的語義:
一個從Product到Part的關聯需要關鍵字字段,可能還有一個索引字段指向Part所對應的表。 <one-to-many>標記指明了一個一對多的關聯。
<one-to-many
class="ClassName" (1)
not-found="ignore|exception" (2)
entity-name="EntityName" (3)
node="element-name"
embed-xml="true|false"
/>
(1) |
class(必須):被關聯類的名稱。
|
(2) |
not-found (可選 - 默認為exception): 指明若緩存的標示值關聯的行缺失,該如何處理: ignore 會把缺失的行作為一個空關聯處理。
|
(3) |
entity-name (可選): 被關聯的類的實體名,作為class的替代。
|
例子
<set name="bars">
<key column="foo_id"/>
<one-to-many class="org.hibernate.Bar"/>
</set>
注意:<one-to-many>元素不需要定義任何字段。 也不需要指定表名。
重要提示
:如果一對多關聯中的外鍵字段定義成NOT NULL,你必須把<key>映射聲明為not-null="true",或者使用雙向關聯,并且標明inverse="true"。
詳細請看http://www.huihoo.com/framework/hibernate/reference-v3_zh-cn/collections.html
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?setBook.JAVA
package?com.test;

public?class?Book


{
????private?String?bid;
????private?String?bname;
????private?String?bprice;
????public?Book()

????
{
????}
???//寫上get?set3.寫對應的映射文件
Student.hbm.xml
<?xml?version="1.0"?>
<!DOCTYPE?hibernate-mapping
????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"/>
????????</id>

????????<property?name="sname">
????????????<column?name="sname"?sql-type="varchar(16)"?not-null="true"/>
????????</property>

????????<property?name="sage">
????????????<column?name="sage"?sql-type="varchar(16)"?not-null="true"/>
????????</property>

????????<set?name="book"?cascade="all"?outer-join="true">
????????????<key?column="sid"/>
????????????<one-to-many?class="com.test.Book"?/>
????????</set>

????</class>

</hibernate-mapping>Book.hbm.xml
<?xml?version="1.0"?>
<!DOCTYPE?hibernate-mapping
????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"/>
????????</id>

????????<property?name="bname">
????????????<column?name="bname"?sql-type="varchar(16)"?not-null="true"/>
????????</property>

????????<property?name="bprice">
????????????<column?name="bprice"?sql-type="varchar(16)"?not-null="true"/>
????????</property>

????</class>

</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();
????}
}

好了。。
在這里把這些例子幾下來。。方便查閱。。
也是很適合象我們這樣的出學者。。。