hibernate一对多例子

一对多关联(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();
    }
}

http://bbs.w3china.org/blog/more.asp?name=lhwork&id=21524

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值