码迷,mamicode.com
首页 > Web开发 > 详细

第二节 hibernate session基本方法介绍

时间:2016-06-30 01:14:08      阅读:400      评论:0      收藏:0      [点我收藏+]

标签:

  Hibernate session 对象是和数据库建立连接的对象,session中包含了许多操作数据库的方法,下面一一描述。

1 保存对象到数据库 session.save();

按照第一节的配置,主键的生成策略为native(数据库自动生成主键),由于数据库使用的是mysql 5,所以是自增的主键生成方式。保存对象时并不需要设置id属性。

    @Test
    public void testSave() {
        try {
            User user = new User();
            user.setBirthday(new java.sql.Date(0));
            user.setName("binyulan");
            session.save(user);
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            throw e;
        }
    }

2 保存对象到数据库 session.persist();

这个方法和session.save()方法一样,都是保存对象到数据库。但是不能设置id属性,否则抛出异常。

    @Test
    public void testPersist() {
        try {
            User user = new User();
            user.setBirthday(new java.sql.Date(0));
            user.setName("binyulan");
            user.setId(13);
            session.persist(user);
        } catch (HibernateException e) {
            e.printStackTrace();
            if (transaction != null) {
                transaction.rollback();
            }
            throw e;
        }
    }

 执行testPersist后抛出异常,如下:

org.hibernate.PersistentObjectException: detached entity passed to persist: com.binyulan.domain.User
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:139)
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)

3 合并对象到数据库 session.merge();

1) 保存未设置id属性的User对象,执行insert把User对象保存到数据库中,同时返回保存后的User对象。

    @Test
    public void testMerge() {
        try {
            User user = new User();
            user.setBirthday(new java.sql.Date(0));
            user.setName("binyulan2");
            User user1 = (User) session.merge(user); //把user属性拷贝到新建的user1对象,执行insert插入数据库,并且返回新建的user1对象,这个对象包含id,在session缓存中
            System.out.println(user1 == user); //返回false。user为新建的对象,user1为新建的持久化对象,并且在session的缓存中。
        } catch (HibernateException e) {
            e.printStackTrace();
            if (transaction != null) {
                transaction.rollback();
            }
            throw e;
        }
    }

2) 保存设置id属性的User对象,首先执行select查询数据库。若数据库中存在此id的记录,并且与数据库中记录不一致,则执行update操作,

若不存在此记录,否则执行insert操作。

    @Test
    public void testMerge1() {
        try {
            User user = new User();
            user.setBirthday(new java.sql.Date(0));
            user.setName("binyulan123");
            user.setId(20);
            /**
             * 把user属性拷贝到新建的User对象,并且执行select查询数据库。
             * 存在此记录且与数据库中记录不一致,执行update
             */
            User user1 = (User) session.merge(user); 
            System.out.println(user1 == user); //返回false。user为新建的对象,user1为新建的持久化对象,并且在session的缓存中。
            
            /**
             * 把user属性拷贝到新建的User对象,并且执行select查询数据库。
             * 数据库中不存在id为123456789的记录,执行insert
             */
            user.setId(123456789L);
            User user2 = (User) session.merge(user); 
            System.out.println(user2 == user); //返回false。user为新建的对象,user2为新建的持久化对象,并且在session的缓存中。
        } catch (HibernateException e) {
            e.printStackTrace();
            if (transaction != null) {
                transaction.rollback();
            }
            throw e;
        }
    }

 

写累了,明天再写,未完待续

 

请勿转载,谢谢合作

 

第二节 hibernate session基本方法介绍

标签:

原文地址:http://www.cnblogs.com/binyulan/p/5628579.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!