ITPUB??ì3
ITPUB论坛 » Java企业开发 » 求一个Hibernate多对多自身关联的例子代码

新一届的微软MVP评选已经开始,欢迎各位推荐!

标题: 求一个Hibernate多对多自身关联的例子代码
离线 smartpig
老会员



精华贴数 1
个人空间 160
技术积分 6249 (212)
社区积分 0 (1065303)
注册日期 2006-8-9
论坛徽章:33
会员2007贡献徽章开发板块每日发贴之星开发板块每日发贴之星开发板块每日发贴之星生肖徽章2007版:鼠生肖徽章2007版:鼠
生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠

发表于 2008-5-16 11:41 
求一个Hibernate多对多自身关联的例子代码

求一个Hibernate多对多自身关联的例子代码


只看该作者    顶部
离线 juanpeng
中级会员



精华贴数 0
个人空间 0
技术积分 4608 (294)
社区积分 0 (1441085)
注册日期 2007-6-21
论坛徽章:27
开发板块每日发贴之星开发板块每日发贴之星开发板块每日发贴之星生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠
生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠

发表于 2008-5-16 11:43 
1.建表

create   table  student
(sid  varchar ( 32 )  not   null   primary   key ,
sname  varchar ( 16 ),
sage  varchar ( 16 ),
)

create   table  course
(cid  varchar ( 32 )  not   null   primary   key ,
cname  varchar ( 16 )
)

create   table  student_course_link
(sid  varchar ( 32 )  not   null ,
cid  varchar ( 32 )  not   null ,
primary   key (sid,cid)
)
2.写VO
StudentVO
package com.test;
import java.util.Set;
public class Student
{
    private String sid;
    private String sname;
    private String sage;

    private Set course;
    public Student()
    {
    }
   //写上get setCourse vo
package com.test;

import java.util.Set;

public class Course
{
    private String cid;
    private String cname;
    private Set student;
   //写上get set
写配置文件
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="course" table="student_course_link" cascade="all" outer-join="false">
             <key column="sid"/>
             <many-to-many class="com.test.Course" column="cid"/>
         </set>
   
     </class>

</hibernate-mapping>
Course.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.Course" table="course" >

         <id name="cid" type="string" unsaved-value="null" >
             <column name="cid" sql-type="char(32)" not-null="true"/>
             <generator class="uuid.hex"/>
         </id>

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

         <set name="student" table="student_course_link" lazy="false" cascade="all">
             <key column="cid"/>
             <many-to-many class="com.test.Student" column="sid"/>
         </set>
   
     </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 写测试类了..
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 TestManyToMany
{
    SessionFactory sf;
    Session session;
    public TestManyToMany()
    {
        try
        {
            Configuration cfg = new Configuration();
            sf = cfg.addClass(Student.class).addClass(Course.class).buildSessionFactory();
        }
        catch(HibernateException ex)
        {
            ex.printStackTrace();
        }
    }
    public void doCreate()
    {
        try
        {
            session = sf.openSession();

            Student student = new Student();
            student.setSname("小王");
            student.setSage("22");

            Set courseSet = new HashSet();
            Course course = null;
            for(int i=0;i <2;i++)
            {
                course = new Course();
                if(i==0)
                    course.setCname("c++");
                else if(i==1)
                    course.setCname("java");
                courseSet.add(course);
            }
            student.setCourse(courseSet);
            
            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;
            Course course = 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.getCourse().iterator();
                while(it.hasNext())
                {
                    course = (Course)it.next();
                    System.out.println("课程名: "+course.getCname());
                }


            }

        }
        catch(HibernateException ex){
            ex.printStackTrace();
        }
        finally{
            try{
                session.close();
            }
            catch(HibernateException ex2){
            }
        }
    }
    public static void main(String[] args)
    {
        TestManyToMany t = new TestManyToMany();
        //t.doCreate();
        t.doQuery();
    }
}


只看该作者    顶部
离线 smartpig
老会员



精华贴数 1
个人空间 160
技术积分 6249 (212)
社区积分 0 (1065303)
注册日期 2006-8-9
论坛徽章:33
会员2007贡献徽章开发板块每日发贴之星开发板块每日发贴之星开发板块每日发贴之星生肖徽章2007版:鼠生肖徽章2007版:鼠
生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠生肖徽章2007版:鼠

发表于 2008-5-16 11:46 
不过我要的是自身多对多关系,一个表跟自己关联起来。


只看该作者    顶部
离线 water3000
初级会员



精华贴数 0
个人空间 0
技术积分 14 (68862)
社区积分 0 (173550)
注册日期 2004-10-8
论坛徽章:0
      
      

发表于 2008-5-16 14:27 
我做的时候没有在表里显式的建立自身的many-to-many, 而是在逻辑层里自己维护关系了。。。

也想看看高人怎么做的


只看该作者    顶部
离线 Dennis68cn


精华贴数 20
个人空间 0
技术积分 8697 (140)
社区积分 5544 (267)
注册日期 2002-2-19
论坛徽章:29
现任管理团队成员2008年新春纪念徽章    
      

发表于 2008-5-17 21:36 
应该尽量避免这样的关联出现。我想很多时候多对多关联可以转化为多对一,而自身多对多关联更似设计缺陷!


__________________
朴素与繁华、脆弱与坚强、纯真与沧桑
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问