Hibernate 学习笔记-2-1(Hibernate的多对一关联)

本文介绍Hibernate框架中多对一关联映射的具体实现方式,包括如何在User类和Group类之间建立关联关系,并通过配置文件指定外键名称。此外,还提供了完整的JUnit测试示例,展示了如何保存具有多对一关联的对象。

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

Hibernate多对一关联

 关联映射的本质
 * 是将关联关系映射到数据库中,关联关系在对象模型中体现为内存中的一个或多个引用
 
<many-to-one>标签会在“多”的一端添加一个外键,指向“一”的一端,这个外键是由<many-to-one>
标签中的column属性定义的,如果忽略column属性,默认创建的外键与属性名相同 

本人创建了一个User类,其中User有一个Group属性,User和Group就是Many to One 的关系

1.先上一张项目的完整包图,让大家都有个大致了解:

2.同时上我的User.java以及Group.java(id的类型都采用int,主键生成策略采用native,对应MySQL就是auto_increment):

package  com.codedestiny.hibernate;

public   class  User  {

    
private int id;
    
private String name;
    
private Group group;
    
    
public int getId() {
        
return id;
    }

    
public void setId(int id) {
        
this.id = id;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public Group getGroup() {
        
return group;
    }

    
public void setGroup(Group group) {
        
this.group = group;
    }

    
}

package  com.codedestiny.hibernate;

public   class  Group  {
    
    
private int id;
    
private String name;
    
    
public int getId() {
        
return id;
    }

    
public void setId(int id) {
        
this.id = id;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

}

 

3.Group.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"
>
< hibernate-mapping >
    
< class  name ="com.codedestiny.hibernate.Group"  table ="t_group" >
        
< id  name ="id" >
            
< generator  class ="native" ></ generator >
        
</ id >
        
< property  name ="name" ></ property >
    
</ class >
</ hibernate-mapping >     

 

4.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"
>
< hibernate-mapping >
    
< class  name ="com.codedestiny.hibernate.User"  table ="t_user" >
        
< id  name ="id" >
            
< generator  class ="native" ></ generator >
        
</ id >
        
< property  name ="name" ></ property >
        
< many-to-one  name ="group"  column ="relatedGroup" ></ many-to-one >
        
<!--  
            <many-to-one name="group" column="relatedGroup" cascade="all"></many-to-one>
            通过级联,可以不需要再session.save(group),但一般开发中不经常这样使用
        
-->
    
</ class >
</ hibernate-mapping >     

 

5.JUnit测试类:Many2OneTest.java:(在没有设置级联时,一定要记住session.save(group))

package  com.codedestiny.hibernate;

import  org.hibernate.Session;
import  junit.framework.TestCase;

public   class  Many2OneTest  extends  TestCase  {

    
public void testMany2One() {
        Session session 
= null;
        
try {
            session 
= HibernateUtils.getSession();
            session.beginTransaction();
            
            Group group 
= new Group();
            group.setName(
"Xihua Univercity");
            
            
//将group转换为持久对象,若在这里不保存group,后面session.save(u)将会抛出一个TransientObjectException,
            
//因为持久化对象不能直接引用瞬时对象
            session.save(group);
                        
            
for(int i=0; i<10; i++{
                User u 
= new User();
                u.setName(
"student" + i);
                
                
//建立对象之间的关系
                u.setGroup(group);
                
                session.save(u);
            }

            session.getTransaction().commit();
        }
 catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
 finally {
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testLoaduser() {
        Session session 
= null;
        
try {
            session 
= HibernateUtils.getSession();
            session.beginTransaction();
            User u 
= (User)session.load(User.class11);
            System.out.println(
"User Name : " + u.getName());
            System.out.println(
"relatedGroup : " + u.getGroup().getName());
            session.getTransaction().commit();
        }
 catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
 finally {
            HibernateUtils.closeSession(session);
        }

    }

    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值