4.映射(1)(多对一)(hibernate笔记)

主要内容:

  • 多对一关联映射

一、多对一关联映射(工程hibernate_many2one

  • 关联映射的本质
    将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用

  • 设置属性cascade
    表示一种级联,如果设置了这个属性,那么我们在保存用户之前不需要事先保存组。默认值是none,还有all、save-update、delete属性。比如删除,当我们删除猫猫这条记录的时候就会将组也删了(这样其实也是删不掉的)。一般设置为all,但是只有保存和更新起作用,一般不要进行删除。这样我们就不需要像第二个方法那样,就可以直接使用第一种方法进行存储。同时这个属性对查询数据操作没有影响。这是对象的连锁操作。

相关映射:

4.映射(1)(多对一)(hibernate笔记)_第1张图片
实体类映射.png

4.映射(1)(多对一)(hibernate笔记)_第2张图片
数据库表映射.JPG

这里我们先在数据库中新建数据库hibernate_many2one
User.hbm.xml




    
        
            
        
        
        
        
    

Group.hbm.xml




    
        
            
        
        
    

测试:
Many2OneTest.java

package cn.itcast.hibernate;
import org.hibernate.Session;
import org.junit.Test;

public class Many2OneTest{
    
    @Test
    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
            //状态,没有id。也就是说持久化对象不能引用瞬时对象,请看下一个方法
            session.save(user1);
            session.save(user2);
            
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            HibernateUtils.closeSession(session);
        }
    }
}

注意:这里只有在我们没有配置cascade="all"才会不能成功保存,如果配置了这项是可以成功保存的,如果没有配置这项,我们可以使用下面这个方式进行保存。

    @Test
    public void testSave2(){
        Session session = null;

        try{
            session = HibernateUtils.getSession();
            session.beginTransaction();
            
            //先要有组对象
            Group group = new Group();
            group.setName("高一班");
            //存储Group对象,使之变成persistent状态
            session.save(group); 
            
            //建立用户
            User user1 = new User();
            user1.setName("猫猫");
            user1.setGroup(group);
            
            User user2 = new User();
            user2.setName("狗狗");
            user2.setGroup(group);
            
            //可以正确存储
            session.save(user1);
            session.save(user2);
            
            session.getTransaction().commit();

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

说明:这里我们先保存Group之后让其变成persistent状态之后再进行保存,但是一般我们还是配置cascade="all"

再对加载进行测试:

    @Test
    public void testLoad1(){
        Session session = null;

        try{
            session = HibernateUtils.getSession();
            session.beginTransaction();
            //同时这个能查出来表明和cascade没有关系
            User user = (User) session.load(User.class, 1);
            System.out.println(user.getName());
            System.out.println(user.getGroup().getName());
            
            session.getTransaction().commit();

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

说明:这里从试验可知加载时不管我们有没有配置cascade="all"时都会起作用,因为我们使用了这个标签。

你可能感兴趣的:(4.映射(1)(多对一)(hibernate笔记))