Hibernate 关联查询

此例子为多对一单向关联;
也即多个学生可有一个老师来教;
在运行此例子时;
条件一:mysql中,存在localhost 的root 用户,密码为:123456,//--此项如果没有,要自行修改hibernate.cfg.xml中的用户登录信息;
条件二:JDK的版本在1.5.0以上,;Eclipse 3.0以上为最佳;如果使用MyEclipse 2.0以上(其它IDE另当别论)就更好;
如果没有Mysql JDBC的话,到我的资源上去下载;如果改用其它的数据库,一样适用,但hibernate.cfg.xml要修改,对于初学者来说,在不会MyEclipse 自动生成配置文件之前;最好先用Mysql;在此介绍一下,mysql client的登录语句:MS: Mysql -hlocalhost -uroot -p123456(附加:MS 在后面均指MYSQL语句);

创建数据库:MS:create database iyvbb ;

创建学生表:MS:create  table student( id integer not null auto_increment,studentName varchar(255), teacher_id integer,primary key(id) );

创建老师表:MS:create table teacher(id integer not null auto_increment,teacherName varchar(255), primary key(id) );

第一:打开Eclipse,   文件/新建/项目/选择JAVA项目,进入创建JAVA项目对话框,输入LoaferIyvbb,单击“下一点”进入“JAVA设置”对话框,在项目下新建一文件夹(目的为储存包文件),名为:lib ;

在“JAVA 设置”框中,单击“库”添加自己所需要的库:如mysql 需要:mysql_connection_java.jar文件,Hibernate需要hibernate3.jar文件,还有其它的如:log4j.jar ,cmt.jar,jboos.jar。。。此处不多介绍;之后,单击“完成”即可创建新的项目;

第二:把所需要的包文件,复制到:/lib目录下,然后右击“LoaferIyvbb"项目,选择“属性”,进入“LoaferIyvbb属性“对话框中,选择Java 构建路径 项,之后,单击“库”文件,把刚才复制到:/lib下的包,添加到项目中去,之后,保存完成包的加载;右击项目,创建源文件夹src,
 
结构图:
-LoaferIyvbb
  |-src
     |-com
         |-HibernateSessionFactory.java
     |-com.loafer.iyv
         |-AbstractStudent.java
         |-AbstractTeacher.java
         |-ServiceSelect.java
         |-Student.java
         |-Teacher.java
         |-Student.hbm.xml
         |-Teacher.hbm.xml
     |-hibernate.cfg.xml
         |-log4j.properties
  |-lib
      |-包
  .....


第三:在项目中,新建包:包名为;com和com.loafer.iyv;在包com中,创建类:HibernateSessionFactory.java文件(此文件为工厂会话集);代码如下:
********************************************************************************************************
package com;//此文件在com包下;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {   
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private  static Configuration configuration = new Configuration();
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;
 static {
     try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
  } catch (Exception e) {
   System.err
     .println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
    }
    private HibernateSessionFactory() {
    }
 
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

  if (session == null || !session.isOpen()) {
   if (sessionFactory == null) {
    rebuildSessionFactory();
   }
   session = (sessionFactory != null) ? sessionFactory.openSession()
     : null;
   threadLocal.set(session);
  }

        return session;
    }

 
 public static void rebuildSessionFactory() {
  try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
  } catch (Exception e) {
   System.err
     .println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
 }

 
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

 
 public static org.hibernate.SessionFactory getSessionFactory() {
  return sessionFactory;
 }

 
 public static void setConfigFile(String configFile) {
  HibernateSessionFactory.configFile = configFile;
  sessionFactory = null;
 }

 
 public static Configuration getConfiguration() {
  return configuration;
 }

}
***********************************************************************************************************
 
并在项目的要目录下创建:Hibernate.cfg.xml文档;代码如下:
************************************************************************************************
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

 <session-factory>
  <property name="connection.username">root</property>
  <property name="connection.url">
   jdbc:mysql://localhost:3306/iyvbb
  </property>
  <property name="dialect">
   org.hibernate.dialect.MySQLDialect
  </property>
  <property name="myeclipse.connection.profile">myhiber</property>
  <property name="connection.password">123456</property>
  <property name="connection.driver_class">
   com.mysql.jdbc.Driver
  </property>
  <mapping resource="com/loafer/iyv/Student.hbm.xml" />
  <mapping resource="com/loafer/iyv/Teacher.hbm.xml" />

 </session-factory>

</hibernate-configuration>

****************************************************************************************************
使用过MyEclipse 的,都应该知道:上述的两个文件是可以自动回载的:

下载开始着手写:Student.hbm.xml和Student.java(父类为:AbStractStudent.java)文件;
首先讲Student.java:
**************************************************************************************
(一)父类
package com.loafer.iyv;
// default package

import com.loafer.iyv.Teacher;


/**
 * AbstractStudent generated by MyEclipse Persistence Tools
 */

public abstract class AbstractStudent  implements java.io.Serializable {


    // Fields   

     private Integer id;
     private Teacher teacher;
     private String studentName;


    // Constructors

    /** default constructor */
    public AbstractStudent() {
    }

   
    /** full constructor */
    public AbstractStudent(Teacher teacher, String studentName) {
        this.teacher = teacher;
        this.studentName = studentName;
    }

  
    // Property accessors

    public Integer getId() {
        return this.id;
    }
   
    public void setId(Integer id) {
        this.id = id;
    }

    public Teacher getTeacher() {
        return this.teacher;
    }
   
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    public String getStudentName() {
        return this.studentName;
    }
   
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
}

(二)子类:
package com.loafer.iyv;
// default package
// Generated by MyEclipse Persistence Tools

import com.loafer.iyv.Teacher;


/**
 * Student generated by MyEclipse Persistence Tools
 */
public class Student extends AbstractStudent implements java.io.Serializable {

    // Constructors

    /** default constructor */
    public Student() {
    }

   
    /** full constructor */
    public Student(Teacher teacher, String studentName) {
        super(teacher, studentName);       
    }
  
}


**************************************************************************
与之对应的映射文档为:Student.hbm.xml代码如下:
***************************************************
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.loafer.iyv.Student" table="student" catalog="iyvbb">
        <id name="id" type="integer">
            <column name="id" />
            <generator class="identity"></generator>
        </id>
        <many-to-one name="teacher" class="com.loafer.iyv.Teacher" fetch="select">
            <column name="teacher_id" />
        </many-to-one>
        <property name="studentName" type="string">
            <column name="studentName" />
        </property>
    </class>
</hibernate-mapping>

************************************************************
下面接着上面的思路创建:Teacher.java(父类为:AbstractTeacher.java)与Teacher.hbm.xml文档;
其中Teacher.java文档为:
***************************************************************************************************************
(一)父类
package com.loafer.iyv;
// default package

import java.util.HashSet;
import java.util.Set;


/**
 * AbstractTeacher generated by MyEclipse Persistence Tools
 */

public abstract class AbstractTeacher  implements java.io.Serializable {


    // Fields   

     private Integer id;
     private String teacherName;
     private Set students = new HashSet(0);


    // Constructors

    /** default constructor */
    public AbstractTeacher() {
    }

   
    /** full constructor */
    public AbstractTeacher(String teacherName, Set students) {
        this.teacherName = teacherName;
        this.students = students;
    }

  
    // Property accessors

    public Integer getId() {
        return this.id;
    }
   
    public void setId(Integer id) {
        this.id = id;
    }

    public String getTeacherName() {
        return this.teacherName;
    }
   
    public void setTeacherName(String teacherName) {
        this.teacherName = teacherName;
    }

    public Set getStudents() {
        return this.students;
    }
   
    public void setStudents(Set students) {
        this.students = students;
    }
}
(二)子类
package com.loafer.iyv;
// default package
// Generated by MyEclipse Persistence Tools

import java.util.Set;

 

/**
 * Teacher generated by MyEclipse Persistence Tools
 */
public class Teacher extends AbstractTeacher implements java.io.Serializable {

    // Constructors

    /** default constructor */
    public Teacher() {
    }

   
    /** full constructor */
    public Teacher(String teacherName, Set students) {
        super(teacherName, students);       
    }
  
}

******************************************************************************************************
与之对应的映射文档为:Teacher.hbm.xml,代码如下所示;
*******************************************************************
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.loafer.iyv.Teacher" table="teacher" catalog="iyvbb">
        <id name="id" type="integer">
            <column name="id" />
            <generator class="identity"></generator>
        </id>
        <property name="teacherName" type="string">
            <column name="teacherName" />
        </property>
        <set name="students" inverse="true">
            <key>
                <column name="teacher_id" />
            </key>
            <one-to-many class="com.loafer.iyv.Student" />
        </set>
    </class>
</hibernate-mapping>

********************************************************************
设置工作到此告一段落;下面来写一查询类ServiceSelect.java,显示结果;
package com.loafer.iyv;
import com.HibernateSessionFactory;
import org.hibernate.*;
import java.util.*;

public class ServiceSelect {

 /**
  * @param args
  */
 static Session s=null;
 static Transaction tx=null;
 public static void main(String[] args) {
  // TODO 自动生成方法存根
  try{
   s=HibernateSessionFactory.getSession();
   List list=s.createQuery("from Student").list();
   for(int i=0;i<list.size();i++){
    Student st=(Student)list.get(i);
    System.out.println("Student is "+st.getStudentName());
    Teacher t=st.getTeacher();
    System.out.println("teacher is "+t.getTeacherName());
   }
  }catch(Exception e){
   e.printStackTrace();
   
  }finally{
   s.close();
  }

 }

}


右击ServiceSelect.java,选择 运行/java 应用程序;

附加:如果因为没有加载log4j的话,不用管它,结果一样可以显示的;

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值