hibernate级联配置

来源:互联网 发布:imac 删除软件 编辑:程序博客网 时间:2024/06/06 00:18

级联更新

1.级联是指两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作;
2.级联配置通过many-to-one的cascade属性实现;
3.cascade属性有四种取值:
  all:所有操作都执行级联操作;
  none:所有操作都不执行级联操作;
  save-update:保存和更新时执行级联操作;
  delete:删除时执行级联操作;
4.通过级联操作可以解决持久化对象不能直接引用瞬时对象的问题。

 

第一.一对多处理 

Group.hbm.xml:





User.hbm.xml: 
  

 

 

public static void main(String[] args) {   

        Session session = HibernateSessionFactory.getSession();   

        session.beginTransaction();   

           

       Group group = new Group();   

        group.setName("J2EE Developer");   

           

        for (int i = 0; i < 10; i++) {   

           User user = new User();   

           user.setUsername("name" + i);   

           user.setPassword("111");   

          user.setGroup(group);   

            session.save(user);   

        }   

           

       session.getTransaction().commit();   

          

        HibernateSessionFactory.closeSession();   

    }   

 

 

第二.级联加载问题

配置中该如何配置,才能实现仅加载一层关系?比如,学生包含一个班级,班级包含多个学生,我想查学生的时候他自动加载学生所在的班级,但那个班级的其他学生信息就不要加载了。

最好的方法就是手动加载,把lazy设置成true
如果你想查询学生的时候加载班级那么你在studentDao里面这样写

Hibernate.initialize(student.getClass())这句话就是加载了班级这个类
给你个例子:
这是个司机(Employee)和车(cart)加载关系,我是让加载车的时候,把司机也要加载上
public List<Carts> selectEnableCarts(int startResult, int length) {
try {
List<Carts> list = this.getSession().createQuery(
"select c from Carts as c where c.cartsState=:cartsState ")
.setLong("cartsState", new Long(1)).setFirstResult(
startResult).setMaxResults(length).list();
for (Iterator<Carts> it = list.iterator(); it.hasNext();) {
Carts carts = it.next();
if (Hibernate.isInitialized(carts)) {
Hibernate.initialize(carts.getEmployee());
}
}
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}

}

 


第三:多对多级联处理
Hibernate实现多对多关系映射有两种方法:
1.通过配置两个一对多来实现多对多,既三张数据表,三个实体,同时配置<component>组件模块,唯一缺点是要同时实现这个外键中间表的增删查改功能.
2.通过配置双方的<set>模块来实现,同时两个实体的bo对象都有对方的Set集合,而inverse必须设置主控方为false,被控方为inverse=true,如果双方都为true(即都为被控方)那就没人来维护关系,那么更新/删除数据时无论哪一方都不会去更新/删除中间表的数据...通过Hibernate配置后已经可以实现主控方删除时能删除本身数据和中间表数据,而被控方只能删除本身表的数据,中间表的数据仍然存在....要想实现被控方删除时同时删除中间表数据,需要去数据库中设置外键中间表的关联关系为delete cascade就可以了..

以下为hibernate配置:
User:
<set name="roles" table="userrole" inverse="false">     
      <key column="username"/>    
      <many-to-many class="com.incesoft.ui.bo.Role" column="id" />  
</set>

Role:
<set name="users" table="userrole" inverse="true">     
      <key column="id"/>    
      <many-to-many class="com.incesoft.ui.bo.User" column="username" />  
</set>

 

 

第四:一对一关系处理

Card.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">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.gpdi.test.Card" table="CARD_TEST">
 
        <id name="cardid" type="integer">
            <column name="CARDID" />
            <generator class="foreign" >
            <param name="property">user</param>
            </generator>
        </id>
        <property name="cardnum" type="string">
            <column name="CARDNUM" length="45" not-null="true" />
        </property>
        <!--
        foreign-key="userid"指定外键关联的字段,必须,不可缺少 ,cascade="save-update"指定怎么操作级联,非必须
        -->
       <one-to-one name="user" foreign-key="userid" class="com.gpdi.test.User" cascade="save-update"></one-to-one>
    </class>
</hibernate-mapping>

User.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">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.gpdi.test.User" table="USER_TEST">
        <id name="userid" type="integer">
            <column name="USERID" />
            <generator class="increment"/>
        </id>
        <property name="username" type="string">
            <column name="username" length="45" not-null="true" />
        </property>
        <one-to-one name="card" foreign-key="cardid" class="com.gpdi.test.Card" cascade="save-update"></one-to-one>
        <!--
       <set name="card" inverse="true" cascade="all">
        <key column="cardid" />
        <one-to-many class="com.gpdi.test.Card" />
        </set>
         <many-to-one  name="card" class="com.gpdi.test.Card"  insert="true" unique="true" lazy="false">
         <column name="cardid"  length="18"  />
        </many-to-one>
        -->
 
    </class>
</hibernate-mapping>


public void save(User user){
 user.setUsername("TEST");
 Card card=new Card();
 card.setCardnum("HGJUYT");
 user.setCard(card);
 Session session=HibernateSessionFactory.currentSession();
    card.setUser(user);
 Transaction tr=session.beginTransaction();
 session.save(user);
 //session.save(card);
 tr.commit();
 session.close(); 
}

 

原创粉丝点击