第二节 hibernate session基本方法介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二节 hibernate session基本方法介绍相关的知识,希望对你有一定的参考价值。

  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基本方法介绍的主要内容,如果未能解决你的问题,请参考以下文章

第十二节:Hibernate 事务隔离,对象状态

第二十二节

学习vue第二十二节,路由的基本使用方法

:Python的基本数据类型-第二节:Python中表示“有序”(序列)的数据类型

hibernate查询-基本查询

Hibernate的Session详解