计应134 郑寿奎
这个分为二个操作:数据库操作和MyEclipse操作
关系映射有:单双向1-n、n-1、n-n。
映射关系多由数据库里的表关系决定
当然也可以只对一个表进行操作
单双向1-n、n-1由二个表
单双向n-n由三个表,其中第三个表连接另外二个表
以下是创建n-n MyEclipse从数据库逆向生成Hibernate实体类:
数据库操作:
创建表:Person_inf
address_inf
person_address
其中的关系是:person_address创建外键
需要注意的是person_inf和address_inf这二个表的主键都要标识为自增
MyEclipse操作:
1.新建一个 Web Project项目
2.新建一个DB数据库连接:
Window->Show View->Other->搜索DB
右击空白处 New新建一个DB数据库连接:
Finish完成
3.右击项目名->MyEclipse->add Hibernate Capab.......
Next
Next
next
Finish完成
4.自动生成实体类:
Open打开DB数据库连接
找到数据库名字点开->找到dbo点开->找到TABLE点开->选择表右击->Hibernate Reverse Engineering..
单击Browse
勾选
Next下一步
Next下一步
分别单击Person_inf和address_inf二个表把Id Generator:里的值选择为:native
单击Finish完成
生成如下:
5.修改部分代码
(1).在hibernate.cfg.xml里的Mappings Add添加上AddressInf.hbm.xml和PersonInf.hbm.xml
(2).分别在AddressInf.hbm.xml和PersonInf.hbm.xml二个配置里的set标签里添加 cascade="all"级联
(3).把PersonInf.java里的代码:
save()方法里的代码
改为:
1 public void save(PersonInf transientInstance) { 2 log.debug("saving PersonInf instance"); 3 try { 4 Transaction t=getSession().beginTransaction(); 5 getSession().save(transientInstance); 6 t.commit(); 7 log.debug("save successful"); 8 } catch (RuntimeException re) { 9 log.error("save failed", re); 10 throw re; 11 } 12 }
然后就可以再index.jsp调用使用了。
6.index.jsp调用使用
单击->单击Add 添加Tomcat服务器
OK
运行Tomcat服务器->运行项目
最后得到:
需要注意:
1.多对多的时候<set>标签里要添加cascade="all"属性
2.在DAO操作类里SAVE方法添加事务:Transaction t=getSession().beginTransaction();
getSession().save(transientInstance);
t.commit();
3.自己编写的查询、删除、修改方法都要加上事务。
4.修改的方法:
public void gengxing(Students a){
Transaction t=getSession().beginTransaction();
getSession().update(a);
t.commit();
}
这里传过来的参数是一个Students类。
所以在传过来之前:
Public Students a;实体类引用过来。
StudentsDAO bb= new StudentsDAO();//操作类引用过来
a=bb.findById(xuehao);//根据ID把所有的信息查询出来
a.setStuName(mingzi);//需要改的信息写入
a.setAge(nianling);//需要改的信息写入
bb.gengxing(a);//直接更改
5.插入:
提交过来的数据:
Classes a=new Classes();//引实体类
a.setClsId(bjh);//写入主键的ID
Students stu = new Students();//引用实体类
stu.setStuId(bh);//写入数据
stu.setStuName(xm);//写入数据
stu.setAge(nl);//写入数据
stu.setClasses(a);//写入数据
StudentsDAO sdao=new StudentsDAO();
sdao.save(stu);//写入数据
6.删除:
public void shanchu(Students a){
Transaction t=getSession().beginTransaction();
getSession().delete(a);
t.commit();
}
这里传过来的参数也是 Students这个类,
public Students a;//定义
StudentsDAO aa=new StudentsDAO();//调用操作类
a= aa.findById(id);//根据ID查出需要删除的数据 a的类型是Studeng findById这个方法是自带的根据ID查询方法
aa.shanchu(a);//调用方法
7.查询:
public List findByClsName(String clsName)
{
Transaction t=getSession().beginTransaction();
String hql="from Students s where s.classes.clsName=?";
Query query=getSession().createQuery(hql);
query.setString(0, clsName);
t.commit();
return query.list();}
这里返回的是一个List集合
所以在接收的时候
定义一个:
public List<Students> a;
StudentsDAO stu=new StudentsDAO();//调用操作类
mz=new String(mz.getBytes("ISO-8859-1"),"UTF-8");//如果是汉字就要进行转换
a=stu.findByClsName(mz);//调用方法
这样查询出来的结果
<s:iterator value="a">
.
.
</s:iterator>循环出来