chapter6 Hibernate的关联映射

来源:互联网 发布:美国地缘政治知乎 编辑:程序博客网 时间:2024/05/29 04:48

回顾

·          下面这个异常是怎么回事?该怎么解决?

org.hibernate.MappingException: Unknownentity: com.aptech.jb.entity.TblUser

 atorg.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:514)

 atorg.hibernate.event.def.DefaultLoadEventListener.onLoad (DefaultLoadEventListener.java:66)

 atorg.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)

 atorg.hibernate.impl.SessionImpl.get(SessionImpl.java:799)

 atcom.aptech.jb.dao.hibimpl.TblUserDAO.findById(TblUserDAO.java:52)

 atcom.aptech.jb.Test.main(Test.java:13)

没有在Hibernate.cfg.xml加

<mappingresource="com/aptech/jb/entity/TblUser.hbm.xml" />

 

 

 

预习检查

1、举一个一对多关联的例子

2、举一个多对一关联的例子

3、举一个多对多关联的例子

4、使用Hibernate配置关联有什么好处?

 

本章任务

·                    使用Hibernate实现:

·                 配置Hibernate关联自动加载区县对应的街道

·                 配置Hibernate关联并实现:

1、增加一个区县:“山南区”

2、增加山南区下属的三个街道

3、删除“五四大道”

4、划“和平路”到海淀区

5、删除山南区

·                 配置Hibernate多对多关联,实现某OA系统项目和人员对照关系的管理

 

 

本章目标

·          掌握单向many-to-one关联

·          掌握双向one-to-many关联

·          掌握many-to-many关联

 

 

 

 

实体间的关联

 

 

 

单向多对一关联

 

 

 

小结

·          在租房系统中,房屋信息(Fwxx)与用户(User)间也是多对一关系。如何配置映射文件,使之可以通过下面的代码输出房屋信息和发布该信息的用户名称?

Fwxx fwxx = (Fwxx)super.get(Fwxx.class,1);

System.out.println(   fwxx.getTitle() + ","

               + fwxx.getUser.getUname());

 

 

双向一对多关联

·          现希望通过qx.getJds()即可获得该区县下所有街道的信息。如何配置映射信息?

<!-- Qx类映射文件 - ->

<classname="Qx" table="TBL_QX">

        <id name="qxid"column="qxid"        type=“java.lang.Long">

            <generatorclass="native" />

        </id>

        <property name="qxname"column="qx"                   type="java.lang.String"/>

        <set name="jds" >

       <key column="qxid" />

       <one-to-many   class="Jd" />

        </set>       

</class>

在Qx映射文件中增加set/one-to-many配置

public class Qx{

     private Integer qxid;

     private String qxname;

     private Set jds =

       new HashSet();

     // Getters & Setters ...

}    

 

双向一对多关联

·          测试程序

Qx qx = (Qx)super.get(Qx.class,1);

System.out.println(qx.getQxname());

 

Iterator it = qx.getJds().iterator();

while (it.hasNext()) {

       Jdjd = (Jd)it.next();

       System.out.print(jd.getJdname()+ "  ");

}

现在我们在“区县”(一)和“街道”(多)两方面都添加了关联,获得了双向一对多的配置

可以只在一的一方配置,从而得到单向一对多关联

·                    在配置好双向一对多后,如何实现下列功能?

1、增加一个区县:“山南区”

2、增加山南区下属的三个街道:“和平路”、“八一路”和“五四大道”

3、删除“五四大道”

4、划“和平路”到海淀区

5、删除山南区

·          增加一个区县:山南区

 

在many一方添加数据

 

 

·          在many一方删除数据的正确做法:

·        给配置文件中set属性增加inverse属性,设为true

  (由many一方负责维护关联)

·         程序代码:

// 在对象模型中删除关系

Jd jd =(Jd)super.get(Jd.class,366);

Qx qx =(Qx)super.get(Qx.class,19);

qx.getJds().remove(jd);

// 在数据库中删除数据

super.del(Jd.class,366);

 

//BaseHibernateDAO中del方法代码

Transaction tx= null;

try {

        tx = session.beginTransaction();

        session.delete(this.get(clazz,id));

        tx.commit();

} catch(RuntimeException re) {

            tx.rollback();

        throw re;           

}

 

 

修改关联关系

·          划“和平路”到海淀区

在one一方删除数据

·          删除山南区

 

·          删除山南区应级联删除下属的区县

·          set节点之cascade属性

·        all                  : 对所有操作都进行级联

·        none             : 对所有操作都不进行级联

·        save-update : 执行更新操作时级联

·        delete            : 执行删除操作时级联

 

 

小结

·          在租房系统中,房屋信息(Fwxx)与用户(User)是多对一关系;房屋信息(Fwxx)与街道(Jd)是多对一关系

 

    请完成下面的方法,完成添加“房屋信息”记录到数据库的功能

/**

 * 新建房屋信息记录

 * @param title 房屋信息标题

 * @param fwxx 房屋信息内容

 * @param userId 用户ID

 * @param jdId 街道ID

 */

public voidpost(String title,String fwxx,int userId,int jdId){

     //TODO:完成这个方法。

}

 

 

 

many-to-many关联

 

 

 

 

·          多对多关系怎么映射呢?

<class name="Project"table="project" >

      <set name="members" table="r_emp_proj">

           <key column="r_proj_id" />

           <many-to-many

               class="com.aptech.jb.entity.Employee"column="r_emp_id" />

       </set>

   </class>

<class name="Employee"table="employee" >

      ...

      <set name="projects" table="r_emp_proj" inverse="true">

           <key column="r_emp_id" />

           <many-to-many

       class="com.aptech.jb.entity.Project"column="r_proj_id" />

       </set>

</class>

 

 

many-to-many关联

·                    编码解决下列问题:

1、新招聘了员工:三叔,加入到国家局供应链项目

2、新立项项目:中教集团网银项目,三叔和胖子参加

3、无敌维护组项目结束,Tod和Hanni退出项目组

 

总结

·          如何配置单向多对一关联?

·          如何配置单向一对多关联?

·          如何配置双向一对多关联?

·          inverse属性的含义是什么?

cascade属性的含义是什么

总结

       1.配置hibernate,导入包,如果和其他包有冲突,优先使用高版本的。

 

       2.hibernate.cfg.xml基本配置

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC

       "-//Hibernate/HibernateConfiguration DTD 3.0//EN"

       "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<propertyname="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>

<propertyname="connection.url">jdbc:sqlserver://localhost:1433;databasename=zf</property>

<property name="connection.username">KingWay</property>

<propertyname="connection.password">feiduit123,.</property>

<propertyname="diglect">org.hibernate.SQLServerDiglect</property>

<propertyname="show_sql">true</property>

<propertyname="format_sql">true</property>

<mappingresource="entity/FWLX.hbm.xml"/>

</session-factory>

</hibernate-configuration>

 

       3.表关系

              many-to-one

首先在实体类中加入对方对象,写GETTER和SETTER方法,在配置文件中加入<many-to-one name="fwlx"class="entity.FWLX" column="lxid" ></many-to-one>如果列名column在前面出现,就需要加入insert="false" update="false"。可以使用对象的属性调用出对应的列值

              one-to-many

首先在实体类中加入对方的set集合,写GETTER和SETTER方法,在配置文件中加入<setname="fwxxs" lazy="true"table="TBL_FWXX"><key column="lxid"></key><one-to-many class="entity.FWXX" /></set>,对set集合进行操作,获取对方的对应的列值

如果要从2个主键和外键表中取值,一般是获取一方对象对多方进行操作进行操作。为了节省数据库资源,省却不必要的update语句,我们一般建议在一对多双向关联关系中,将一方的inverse属性设置为true,即将主外键的关系交由多方来维护。使用多方的对象维护数据,节约系统性能。只要是set都加上inverse="true",多对多除外

cascade属性all : 对所有操作都进行级联none : 对所有操作都不进行级联save-update : 执行更新操作时级联delete: 执行删除操作时级联

              many-to-many,通过中间表实现,中间表不用建立实体类

在2个类中都加入对方的set集合,写Getter和Setter方法,不能写成eId的形式,获取不了getter方法,配置文件中加入<set name="pros" inverse="true" table="r_emp_proj" ><key column="r_emp_id"></key><many-to-manyclass="entity.Project"></many-to-many></set>其中table是中间表名,class是对方的类,column是自己的外键。inverse设在不需要经常更新的那个many里面    

 

       4.数据库用户映射对应的数据库如果打勾,不用登陆也可以执行SQL语句

 

       5. hibernate三个准备添加Hibernate 库 ,添加Hibernate 配置文件,添加对应表的实体类和映射文件

 

       6.hibernate七个步骤

Configuration conf = newConfiguration().configure();//1、读取配置文件

SessionFactory sf =conf.buildSessionFactory();// 2、创建SessionFactory

Session session = sf.openSession();// 3、打开Session

Transaction tx = null;

try{

tx = session.beginTransaction();// 4、开始一个事务

// 5、持久化操作

User user = new User();

user.setUname("Hibernate user");

user.setUpass("password");

session.save(user);

tx.commit();// 6、提交事务     

}catch(Exception e){

if (null!=tx){tx.rollback();}

e.printStackTrace();     

}finally{

session.close();// 7、关闭Session

 

 


原创粉丝点击