你的位置:首页 > Java教程

[Java教程]第二节 hibernate session介绍以及session常用方法介绍


  Session是java应用程序和hibernate框架之间的一个主要接口。它是从持久化服务中剥离出来的一个非常重要的API。

  Session的主要功能是为映射的实体类的实例提供增删改查操作(User.calss 为被映射的实体类,new User()即为实例)。这些实例可能是以下三种状态之一:

1) transient: 从没有被持久化,不在Session缓存中
2) persistent: 在Session的缓存中。
3) detached: 曾经是persistent状态,现在不在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;    }  }

 

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

 

请勿转载,谢谢合作