SSH实现前台更新一个实体对象,数据库更新三层表

来源:互联网 发布:率土之滨练兵经验数据 编辑:程序博客网 时间:2024/06/17 11:22

1、创建三张表test1、test2、test3。test1的主键是test2的外键,test2的主键是test3的外键,三张表的主键都自动增长。选择在删除、更新时层叠。

2、反向工程导入工程。

3、hibernate.cfg.xml添加mapping映射。

4、配置applicationContext.xml

5、<关键>:在test1.hbm.xml中,设置cascade=save-update,实现更新test1时能够更新test2;设置inverse= false,实现更新test2表时,能够更新test2的外键(在test1中是自增长)。

 

 

转载:hibernate多表关联总结

1>:one-to-one(一对一关联)主键关联:
一对一关联一般可分为主键关联和外键关联
主键关联的意思是说关联的两个实体共享一个主键值,但这个主键可以由两个表产生.
现在的问题是:
   *如何让另一个表引用已经生成的主键值
解决办法:
   *Hibernate映射文件中使用主键的foreign生成机制
       eg:学生表:
<hibernate-mapping>
     <class name="org.wen.beans.User" table="user" catalog="study">
         <id name="userid" type="java.lang.Integer">
              <column name="userid" />
              <generator class="native" />
         </id>
         <property name="username" type="java.lang.String">
              <column name="username" length="20" />
          </property>
          <one-to-one name="card" class="org.wen.beans.Card" cascade="all"></one-to-one>
      </class>
  </hibernate-mapping>
  添加:<one-to-one name="card"
         class="org.wen.beans.Card"
         fetch="join"
         cascade="all" />
  <class>元素的lazy属性为true,表示延迟加载,如果lazy设为false,则表示立即加载.以下对这二点进行说明.
    立即加载:表示在从数据库中取得数据组装好一个对象后,会立即再从数据库取得数据组装此对象所关联的对象
    延迟加载:表示在从数据库中取得数据组装好一个对象后,不会立即从数据库中取得数据组装此对象所关联的对象,
        而是等到需要时,才会从数据库取得数据组装此关联对象.
  <one-to-one>元素的fetch属性可选为select和join
    join:连接抓取,Hibernate通过在Select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合.
    select:查询抓取,Hibernate需要另外发送一条select语句抓取当前对象的关联实体或集合.
    ******所以我们一般用连接抓取<join>
证件表:
<hibernate-mapping>
    <class name="org.wen.beans.Card" table="card" lazy="true" catalog="study">
        <id name="cardid" type="java.lang.Integer">
            <column name="cardid" />
            <generator class="foreign">
                <param name="property">user</param>
            </generator>
        </id>
  <!-- id使用外键(foreign)生成机制,引用代号为user的对象
             的主键作为card表的主键和外键。同时user在下面的
             <one-to-one>中进行了定义 -->
        <property name="cardnum" type="java.lang.Integer">
            <column name="cardnum" />
        </property>
        <one-to-one name="user" class="org.wen.beans.User" constrained="true"></one-to-one>
  <!-- constrained="true"表示card引用了student的主键作为外键。 -->
    </class>
</hibernate-mapping>
一对一映射必须加载的元素有:
        name
        class
        constrained(主键关联)
        fetch(关联的一方才有:意思是说需要通过这一方查询另一方数据的一方.比如学生表查询证件中的数据,学生就是关联的一方)
        cascade(关联的一方才有:意思是说需要通过这一方保存或者更新数据对另一方也产生影响(另一方也保存或者更新了,比如保存学生信息,那么与学生相关联的证件信息也保存了))


2><one-to-one>外键关联:
      开发中可以参照<one-to-one>主键关联和<many-to-one>
      这里,学生表保存不变,只改变证件表:
<hibernate-mapping>
    <class name="org.wen.beans.Card" table="card" lazy="true">
        <id name="cardid" type="java.lang.Integer">
            <column name="cardid"/>
            <generator class="increment"/><!-- 不再是foreign了,因为它的主键不是学生表的主键,它的主键是自动产生的,它的外键才是学生表的主键 -->               
        </id>
        <property name="cardnum" type="java.lang.String">
            <column name="cardnum" length="20" />
        </property>     
       <many-to-one name="user" column="userid" class="org.wen.beans.user" unique="true"/>
       <!-- 惟一的多对一,如果被限制为唯一,实际上变成一对一关系了 -->
         <!-- unique设为true表示使用DDL为外键字段生成一个惟一约束。
                 以外键关联对象的一对一关系,其本质上已经变成了一对多的双向关联,
                 应直接按照一对多和多对一的要求编写它们的映射文件。当unique为
                 true时实际上变成了一对一的关系。
     ***这里需要强调一点的是<many-to-one>元素必须有column这一项,它表示这个这个表的外键是什么.注意,这里是表的外键,不是类的外键-->
    </class>
</hibernate-mapping>

3>:<one-to-many>单身关联
    一对多关联分为单向一对多关联和双向一双多关联
    单向的一对多关联只需要在一方进行映射配置
    单身一对多关联:
<hibernate-mapping>
    <class name="org.wen.beans.Customers" table="customers" catalog="study">
        <id name="id" type="java.lang.Long">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="userName" type="java.lang.String">
            <column name="userName" length="20" />
        </property>
        <set name="orders" table="orders" cascade="save-update" inverse="true">
            <key column="customers_ID"></key>
            <one-to-many class="org.wen.beans.Orders"/>
        </set>
    </class>
</hibernate-mapping>
    这里需要强调的是<set>元素的属性代表的意义:
    name
    table
    lazy:当为true时为延迟加载,为false时为立即加载
    inverse:用于表示双向关联中的被动一端,inverse的值为false的一方负责维护关联关系
    cascade
    sort:排序关系,unsorted(不排序),natural(自然排序),comparatorClass(由某个实现了java.util.comparator接口的类型                     指定排序算法。);
    ******<key>子元素的column属性指定关联表(orders表)的外键(customers_ID)
4>:<one-to-many>双向关联:
    如果要设置一对多双向关联关系.那么还需要在"多"的映射文件中使用<many-to-one>
    <many-to-one name="customer"
            class="org.wen.beans.Customers"
            column="customers_ID"
            cascade="none"
                           outer-join="auto"
            insert="false" insert和update设定是否对column属性指定的关联字段进行insert和update操作
            update="false">
    </many-to-one>


4>多对多关联:
    多对多关联时要建一个连接表查询
学生的映射文件
<hibernate-mapping>
    <class name="org.wen.beans.Students" table="students" catalog="study">
        <id name="stuId" type="java.lang.Long">
            <column name="stuID" />
            <generator class="native" />
        </id>
        <property name="sname" type="java.lang.String">
            <column name="sName" length="20" />
        </property>
        <set name="teachers" table="student_teacher_table" cascade="save-update" inverse="false">
            <key column="stuID"></key>
             <many-to-many class="org.wen.beans.Teachers" column="teaID"></many-to-many>
        </set>
  ***对<key>元素的理解:
        它的控制主要是通过stuID(外键)来完成,就是我们从student_teacher_table表中我们只要
        select * from student_teacher_table where stuID='该学生的ID',这样我们就可以得到它的教师的ID了
  ***对<many-to-many>的理解:
        我们从student_teacher_table表中根据stuID拿到了与该stuID关联的teaID,
        然后select * from teacher where teaID='前一步拿到的teaID'
    </class>
</hibernate-mapping>

教师的映射文件
<hibernate-mapping>
    <class name="org.wen.beans.Teachers" table="teachers" catalog="study">
        <id name="teaId" type="java.lang.Long">
            <column name="teaID" />
            <generator class="native" />
        </id>
        <property name="teaName" type="java.lang.String">
            <column name="teaName" length="20" />
        </property>
        <set name="students" table="student_teacher_table" inverse="true">
            <key column="teaID"></key>
            <many-to-many class="org.wen.beans.Students" column="stuID"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

 

原创粉丝点击