Hibernate中many-to-one关系的编写

最近在做毕业设计,开发一个商城的购物模块。用的是 Struts+JavaBean+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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值