hibernate单向一对多级联操作

主类  User     单方

从类  UserIp  多方要求结果:操作USER类,自动添加USERIP并维护关联关系

 

为了节省篇幅,忽略了get/set方法 请自行添加

User类代码:

public class User {

    /**用户的ID*/
    private long id;

 /**登录用户名*/
    private String username;
    
    /**登录密码*/
    private String password;

 /**IP集合*/
    private Set<UserIp> userIps=new HashSet<UserIp>();

 /**--------get/set----------*/

}

 

 

 

 

 

 

 

 

 

 

 

 UserIp类:

public class UserIp {
    
    /**数据库ID*/
    private long id;
    
    /**用户ID*/
    private long userId;
    
    /**IP地址*/
    private String ip;

  /**--------get/set----------*/

}

 

 

 

 

 

 

 

 

 

 

User.hbm.xml:

<hibernate-mapping>
    <class name="com.entity.User" table="user" lazy="false" dynamic-insert="true">
    <id name="id" type="long" column="id">
         <generator class="native" />
    </id>
    <property name="username" column="username" />
    <property name="password" column="password" />
    <set name="userIps" table="user_has_ip" cascade="all-delete-orphan" lazy="false" inverse="false">
          <key column="user_id" /><!-- 确定关联的外键列 -->
          <one-to-many class="com.entity.UserIp" />
    </set>
    </class>
</hibernate-mapping>

 

 

 

 

 

 

 

 

 

 

UserIp.hbm.xml:

<hibernate-mapping>
    <class name="com.entity.UserIp" table="user_has_ip" lazy="false">
        <id name="id" type="long" column="id">
            <generator class="native" />
        </id>
       <property name="ip" column="ip"/>
    </class>
</hibernate-mapping>

 

 

 

 

 

 

其中关键就在于

 inverse="false"   控制反转,不增加这个参数的话,默认也为false,可以理解为true时,放弃级联关系维护权。

cascade="all-delete-orphan"

all-deleteorphan 的能力:
1. 当保存或更新父方对象时,级联保存或更新所有关联的子方对象,相当于 cascade 为 save-update
2. 当删除父方对象时,级联删除所有关联的子方对象,相当于 cascade 为 delete
3. 删除不再和父方对象关联的所有子方对

 

通过此设置,只需要操作User类,即可对UserIp类做增删改查关联关系维护等操作。。

注意:在建立数据库表时,user_id此外键字段不要设置为not-null,因为hibernate操作机器会先插入一条外键为空的userIp数据,之后再用update更新外键,如果设置为not-null就会报错,无法插入。

 

 

 

posted on 2016-02-18 17:42  冰封♀啸  阅读(298)  评论(0编辑  收藏  举报

导航