• 删除方法:

新建的对象立马被删除

@Test
public void testDelete() { Teacher t = new Teacher();
t.setName("t1");
t.setTitle("middle");
t.setBirthDate(new Date()); Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(t);
System.out.println(t.getId());
session.getTransaction().commit(); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.delete(t);
session2.getTransaction().commit();
}

 

删除指定ID的对象:

	@Test
public void testDelete2() { Teacher t = new Teacher();
t.setId(2); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.delete(t);
session2.getTransaction().commit();
}

  

  • load, get区别:

load返回的代理对象, 真正用到对象时才发出sql语句,

get直接从数据库加载,发出sql语句, 不会延迟.

所以load必须在commit之前执行getName方法的操作.

但是get放在commit之前之后都可以.

@Test
public void testLoad() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 1); //此数字是ID System.out.println(t.getName());
session.getTransaction().commit();
//System.out.println(t.getClass());
} @Test
public void testGet() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 1); session.getTransaction().commit();
//System.out.println(t.getClass());
System.out.println(t.getName());
}

update:

第一种情况: 用给的detached对象来更新persistent对象.

@Test
public void testUpdate1() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 1); //persistent session.getTransaction().commit(); t.setName("zhanglaoshi"); //commit后, detached Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(t); //persistent session2.getTransaction().commit();
}

第二种情况:更新transient对象会报错

@Test
public void testUpdate2() {
Teacher t = new Teacher();
t.setName("zhanglaoshi");
Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(t);
session2.getTransaction().commit();
}

第三种情况, 手动设置ID后update, 数据库有对应记录

@Test
public void testUpdate3() {
Teacher t = new Teacher();
t.setId(3);
t.setName("zhanglaoshi"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.update(t); session2.getTransaction().commit();
}

  

第四种情况: 我们在update的时候, 没有设置别的字段, 但是控制台把所有字段都输出了,效率低下.

一个persistent状态的对象只要设定不同字段,  就会更新:

@Test
  public void testUpdate4() {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.class, 1); //Persistent状态
t.setName("zhangsan2"); //缓存和数据库内容不一致, commit时统一
session.getTransaction().commit();
  }

  

最后都没有得到我们想要的效果: 只更新想改变的字段, 有3种方法:

1. xml和annotation设置

annotation方法:Teacher.java里不想更新的字段的get方法前,加入@Column(updatable=false)

xml方法:  <property name="title" update=false> </property>

2. 使用xml的dynamic-update,

<hibernate-mapping>
<class name="com.bjsxt.hibernate.Student" dynamic-update="true">

3. 推荐!!!  HQL (EJBQL)

注意: update后面的Student是对象, 不是表名

@Test
  public void testUpdate7() {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("update Student s set s.name='z5' where s.id = 1");
q.executeUpdate();
session.getTransaction().commit();
  }

  

saveorupdate:

@Test
public void testSaveOrUpdate() { Teacher t = new Teacher();
t.setName("t3");
t.setTitle("middle");
t.setBirthDate(new Date()); Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.saveOrUpdate(t); //没有id所以执行的是save session.getTransaction().commit(); t.setName("t7"); Session session2 = sessionFactory.getCurrentSession();
session2.beginTransaction();
session2.saveOrUpdate(t); //将上面插入的t3update成t7
session2.getTransaction().commit(); }

clear方法: 清除缓存, 不喝数据库打交道.  如果不用clear的话, getName就调用一次select语句, 因为缓存已经存在了

不管get还是load都会先查一级缓存, 缓存没有才会去数据库查找, 所以clear就是清除session缓存

@Test
public void testClear() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 4);
System.out.println(t.getName()); session.clear(); Teacher t2 = (Teacher)session.load(Teacher.class, 4);
System.out.println(t2.getName());
session.getTransaction().commit(); }

  

flush方法: 强制内存到数据库的同步

	@Test
public void testFlush() { Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.class, 4);
t.setName("tt"); session.flush();
t.setName("ttt");
session.getTransaction().commit();
}

  

  

 

 

hibernate--session的CRUD方法, delete, load,get,update,saveorupdate, clear, flush的更多相关文章

  1. Hibernate Session对象核心方法

    1. 持久化对象的状态: 站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态 Session 的特定方法能使对象从一个状态转到另一个状态 临时对象: 在 ...

  2. hibernate Session的CRUD操作

    使用Session里面的方法进行CRUD操作 (1) 增加 save 方法 (2) 查找 get 方法(根据id查) (3) 修改 update 方法 (4) 删除 delete 方法 1.增加 /* ...

  3. 菜鸟学SSH(九)——Hibernate——Session之save()方法

    Session的save()方法用来将一个临时对象转变为持久化对象,也就是将一个新的实体保存到数据库中.通过save()将持久化对象保存到数据库需要经过以下步骤: 1,系统根据指定的ID生成策略,为临 ...

  4. hibernate中save()、get()、load()、update()、saveorupdate()、merge()等方法

    1.save()方法 直接传个user对象 session.save(user); 2.get()方法和load()方法 get(): 传id        session.get(UserInfo. ...

  5. Session中的方法

    Session 管理一个数据库的任务单元,即管理数据库中的增删改查操作,提交事务. 方法CRUD:save(),delete(),load(),get(),update(),saveOrUpdate( ...

  6. [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Hibernate的懒加载session丢失解决方法

    在web.xml加入spring提供的过滤器,延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --> <filter> <fi ...

  8. SSH项目过一段时间之后再访问会报一次Could not open Hibernate session for transaction 异常,Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlyi,再重新方法即可访问成功(通常出现在过了一晚之后再去访问系统)

    前端时间到客户那去进行项目的上线测试,将项目部署好之后,运行都是正常的,可是每到了第二天早上访问的时候,就会报一个Could not open Hibernate session for transa ...

  9. hibernate的集中持久化方法的区别

    一.预备知识 在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient.persistent.detached 下边是常见的翻译办法: transient:瞬态或者自由态 ...

随机推荐

  1. Java多态(一)

    父类: public class Parent { public String name; private String pass; public void say1(AA aa){ System.o ...

  2. AVFoundation(一)---AVAudioPlayer

    AVAudioPlayer相当于一个播放器,它支持多种音频格式,而且能够进行进度.音量.播放速度等控制. 下边通过代码来看一下,它的属性和常用方法(具体说明都写在了注释中): //AVAudioPla ...

  3. vi命令的常用操作

    G:移动到底部 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件, ...

  4. 编译hadoop2.4

    摘自 http://www.aboutyun.com/thread-8130-1-1.html.http://www.dataguru.cn/forum.php?mod=viewthread& ...

  5. mysql 查询 45 道题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  6. .bat批处理命令的介绍

    HUC = = D组 http://www.cnhonkerarmy.com/ 63707869 =====================================开始============ ...

  7. ibdata1文件--缩小mysql数据库的ibdata1文件

    摘要 在MySQL数据库中,如果不指定innodb_file_per_table参数,单独存在每个表的数据,MySQL的数据都会存放在ibdata1文件. mysql ibdata1存放数据,索引等, ...

  8. 解决phpmyadmin上传文件大小限制的配置方法(转)

    phpmyadmin导入SQL文件时涉及到phpmyadmin上传文件大小限制问题,默认phpmyadmin上传文件大小为2M,如果想要 phpmyadmin上传超过2M大文件,就需要修改phpmya ...

  9. LayoutParams 命名的时候,最好用与子控件相关的字符串命名,

    @Override public View initView() { RelativeLayout container = new RelativeLayout(UIUtils.getContext( ...

  10. 修改maven本地仓库路径

    修改maven配置文件conf/settings.xml 在setting标签中添加 <localRepository>E:/bhuwifi_java/repo</localRepo ...