hibernate一对多的列子

先看由满江红翻译团队(RedSaga Translate Team)翻译的一对多配置说明
然后在看例子
 一对多关联(One-to-many Associations)

一对多关联 通过外键 连接两个类对应的表,而没有中间集合表。 这个关系模型失去了一些Java集合的语义:

  • 一个被包含的实体的实例只能被包含在一个集合的实例中

  • 一个被包含的实体的实例只能对应于集合索引的一个值中

一个从ProductPart的关联需要关键字字段,可能还有一个索引字段指向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"

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值