此例子为多对一单向关联;
也即多个学生可有一个老师来教;
在运行此例子时;
条件一: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的话,不用管它,结果一样可以显示的;