Hibernate关联映射多对一关联介绍



Hibernate关联映射多对一关联介绍。many-to-one在多的一端加入一个外键,指向1的一端,该外键是由many-to-one里面column属性定义的,假如忽略了这个属性那默认的外键和实体的属性一致。

<many-to-one>标签的定义实例:<many-to-one name=”group” column=”groupid”/>。

关联映射多对一关联

关联映射多对一关联

 

hibernate多对一关联步骤:

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

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

在User的hbm文件中添加:

 

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

 

代码实现实例:

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: 

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异常

           //因为Group为Transient状态,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:

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

总共可以取值为:all、none、save-update、delete

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对象执行了级联操作,就这样正确的保存。