Hibernate学习11 -- 关联映射1 -- 多对一关联

本文介绍Hibernate框架中多对一关联映射的配置方法,包括如何在实体类之间建立关联关系,如何通过<many-to-one>标签设置外键及级联操作,并提供代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

clip_image002

<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致。

<many-to-one>标签的定义示例:<many-to-one name="group" column="groupid"/>

步骤:

n         建立POJO类:User.javaGroup.java, 建立Hibernate配置文件,将两个hbm文件与其绑定。

n         User.java里面建立一个Group类型的属性

n         Userhbm文件中添加:

<many-to-one name="group" column="groupid"/>

 

n         代码实现:

User.java

public class User {

    private int id;

    private String name;

    private Group group;

Group.java

public class Group {

    private int id;

    private String name;

User.hbm.xml

<hibernate-mapping>

    <class name="User" table="t_user">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name"/>

<many-to-one name="group" column="groupid" />

    </class>

</hibernate-mapping>

Group.hbm.xml

<hibernate-mapping>

    <class name="Group" table="t_group">

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="name"/>

    </class>

</hibernate-mapping>

测试类:

public class Many2OneTest extends TestCase {

    //保存1,不保存Group对象,保存User对象,保存出错

    public void testSave1() {

       Session session = null;

       try {

           session = HibernateUtils.getSession();

           session.beginTransaction();

          

           Group group = new Group();

           group.setName("普通用户");

          

           User user1 = new User();

           user1.setName("张三");

           user1.setGroup(group);

          

           User user2 = new User();

           user2.setName("李四");

           user2.setGroup(group);

          

           //不能成功保存,抛出TransientObjectException异常

           //因为GroupTransient状态,oid没有分配值,

           //persistent状态的对象是不能引用transient状态的对象的

            //解决办法:先保存Group对象或在<many-to-one>标签中加入//cascade=”all”

           session.save(user1);

           session.save(user2);

           session.getTransaction().commit();

       }catch(Exception e) {

           e.printStackTrace();

           session.getTransaction().rollback();

       }finally {

           HibernateUtils.closeSession(session);

       }

    }

    public void testLoad1() {

       Session session = null;

       try {

           session = HibernateUtils.getSession();

           session.beginTransaction();

           User user = (User)session.load(User.class, 3);

           System.out.println("user.name=" + user.getName());

           System.out.println("user.group.name=" +

 user.getGroup().getName());

           session.getTransaction().commit();

       }catch(Exception e) {

           e.printStackTrace();

           session.getTransaction().rollback();

       }finally {

           HibernateUtils.closeSession(session);

       }

    }  

}

 

重要属性cascade

²        级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作

²        总共可以取值为:allnonesave-updatedelete

²        all-代表在所有的情况下都执行级联操作

²        none-在所有情况下都不执行级联操作

²        save-update-在保存和更新的时候执行级联操作

²        delete-在删除的时候执行级联操作

如上面测试many-to-one以及cascade属性的配置,

cascade配置的User-Group执行代码

配置

<many-to-one name=“group” column=“groupid”/>

java代码:

Group group = new Group();

group.setName("jkjk");

User user = new User();

user.setName("管理员");

user.setGroup(group);

session.save(user);

执行结果:

抛出org.hibernate.TransientObjectException异常,以上代码中,group对象是一个瞬时对象,user对象引用了一个瞬时对象,所以在保存的时候出现异常。

添加了cascade=”all”配置,使得hibernate在管理对象的时候,对cascade对象执行了级联操作,就这样正确的保存。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值