最近在做毕业设计,开发一个商城的购物模块。用的是Struts+Hibernate架构网站。后台数据库使用SQL Server 2000。 我是从中间层开始设计的,首先定义功能接口,然后做实现类和数据类。用工厂模式封装起来。持久化层用的DAO模式+Hibernate。在开发中我发现Hibernate的多表联合操作,Mapping文件写起来好像很麻烦。参考书上的例子也昏头转向的(其实是书上的例子和我的思维习惯有点不一样,而且部分字段和类属性名字取的一样,容易混淆,加上书上的例子数据库部分写的不是很详细,所以我就昏了)。
例如表结构为:
CREATE TABLE PEOPLETABLE(PID INT IDENTITY(1,1) PRIMARY KEY,PNAME VARCHAR(50))
CREATE TABLE COMPUTERTABLE(CID INT IDENTITY(1,1) PRIMARY KEY,CMODEL VARCHAR(50),PEOPLE INT REFERENCES PEOPLETABLE(PID))
PEOPLETABLE
PID是COMPUTERTABLE的外键
最初因为没看懂书上的介绍,查询可以(强行用内部定义subselect的方式做的),增删改就昏菜了。
辅导的老师抱怨Hibernate不好用,无法实现让我用JDBC写。我觉得Hibernate如果连这种最常见的数据表处理都做不好,如何能发展到现在?早被其他框架淘汰了。肯定是配置文件和POJO类写得不正确。
去网上看看,不少论坛里也有很多同志一样被这个问题困惑。
终于,自己慢慢自己做例子,实现了一个自我感觉很好的例子。现在我把它在这里共享给大家,希望能对大家的学习开发起到一点小小的帮助。
SQL语句
--建立一个例子数据库
CREATE DATABASE ORTEMP
GO
USE ORTEMP
--建立一个表,PID人员编号,PNAME姓名
CREATE TABLE PEOPLETABLE(PID INT IDENTITY(1,1) PRIMARY KEY,PNAME VARCHAR(50))
--建立另一个表,CID电脑编号,CMODEL电脑型号,PEOPLE人员编号(外键)
CREATE TABLE COMPUTERTABLE(CID INT IDENTITY(1,1) PRIMARY KEY,CMODEL VARCHAR(50),PEOPLE INT REFERENCES PEOPLETABLE(PID))
--给PEOPLETABLE输入一些数据
INSERT INTO PEOPLETABLE VALUES('兔子')
INSERT INTO PEOPLETABLE VALUES('乌龟')
--给COMPUTERTABLE输入一些数据
INSERT INTO COMPUTERTABLE VALUES('联想THINKPAD T60',1)
--查询记录
SELECT * FROM PEOPLETABLE
SELECT * FROM COMPUTERTABLE
然后打开Eclipse,开始写程序。采用Eclipse 3.1.2+MyEclipse 4.11+Hibernate IDE开发。使用MyEclipse是为了能自动生成Session工厂类,省点事情。
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">sa</property>
<property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;databaseName=ORTemp</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="connection.password">810424</property>
<property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
<mapping resource="org/Miao/Bean/PeopleBean.hbm.xml" />
<mapping resource="org/Miao/Bean/ComputerBean.hbm.xml" />
</session-factory>
</hibernate-configuration>
然后定义持久化类ComputerBean和PeopleBean。
ComputerBean.class
package org.Miao.Bean;
public class ComputerBean {
private String id;//COMPUTERTABLE.CID
private String model;//COMPUTERTABLE.CMODEL
private PeopleBean people;//PEOPLETABLE表
public String getId() {
return id;
}
public String getModel() {
return model;
}
public PeopleBean getPeople() {
return people;
}
public void setId(String id) {
this.id = id;
}
public void setModel(String model) {
this.model = model;
}
public void setPeople(PeopleBean people) {
this.people = people;
}
}
PeopleBean.class
package org.Miao.Bean;
public class PeopleBean {
private String id;// PEOPLETABLE.PID
private String name;// PEOPLETABLE.PNAME
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
然后是二者的配置文件:
PeopleBean.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.Miao.Bean">
<class name="PeopleBean" table="PEOPLETABLE">
<id name="id" column="PID">
<generator class="native"></generator>
</id>
<property name="name" column="PNAME"></property>
</class>
</hibernate-mapping>
ComputerBean.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.Miao.Bean">
<class name="ComputerBean" table="COMPUTERTABLE">
<id name="id" column="CID">
<generator class="native"></generator>
</id>
<property name="model" column="CMODEL"></property>
<many-to-one name="people" column="PEOPLE" class="PeopleBean" insert="true" update="true"></many-to-one>
</class>
</hibernate-mapping>
最后是例子程序主类ORTemp.java
内容如下:
package org.Miao;
import java.util.List;
import org.Miao.Bean.ComputerBean;
import org.Miao.Bean.PeopleBean;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class ORTemp {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
Session session=HibernateSessionFactory.currentSession();
//查询存在的纪录
List l;
l=session.createQuery("from ComputerBean").list();
System.out.printf("存在的纪录数量:%s/n",l.size());
//把一个纪录打出来
ComputerBean computer=(ComputerBean)l.get(0);
System.out.printf("id:%s,model:%s,people:%s/n",computer.getId(),computer.getModel(),computer.getPeople().getName());
//添一个新纪录
Transaction t=session.beginTransaction();
computer=new ComputerBean();
computer.setModel("联想天逸");
//取出一个已经存在的PEOPLETABLE表纪录
PeopleBean people=(PeopleBean)session.load(PeopleBean.class,"1");
computer.setPeople(people);
session.save(computer);
session.flush();
t.commit();
//保存完成,现在看看有几条纪录
l=session.createQuery("from ComputerBean").list();
System.out.printf("插入后存在的纪录数量:%s/n",l.size());
//打印所有纪录
for(int i=0;i<l.size();i++){
ComputerBean tmp=(ComputerBean)l.get(i);
System.out.printf("id:%s,model:%s,people:%s/n",tmp.getId(),tmp.getModel(),tmp.getPeople().getName());
}
session.close();
}
}
Session工厂类自动生成的,就不在这里写出来的,大家想看的化,可以看附件中的代码。
现在看看打印和查询的结果吧
输出结果:
存在的纪录数量:1
id:1,model:联想ThinkPad T60,people:兔子
插入后存在的纪录数量:2
id:1,model:联想ThinkPad T60,people:兔子
id:2,model:联想天逸,people:兔子
现在看看表的纪录
SELECT * FROM PEOPLETABLE
结果:
pid pname
1 兔子
2 乌龟
SELECT * FROM COMPUTERTABLE
结果:
cid cmodel people
1 联想ThinkPad T60 1
2 联想天逸 1
我把例子程序、建库的脚本打包放上来,想自己慢慢研究的可以下回去慢慢看。
工程是Eclipse开发的,导到Eclipse中就可以运行了。
特别说明:为了方便传输,我把SQL Server2000的JDBC驱动包从lib目录中拿掉了。大家运行的时候别忘了加进去。
如果有什么建议和问题,欢迎提问,大家一起提高Hibernate的使用经验。
hibernate 有外键的一对一
最新推荐文章于 2018-09-10 19:55:51 发布