本文是接着Hibernate总结(五)--session核心方法(一)继续写的。
目录
1.2.3若数据表中没有对应的记录, 但还调用了 update 方法, 会抛出异常
1Update方法
1.1自动调用update方法
1.1.1代码
@Test
public void testUpdate(){
News news = (News) session.get(News.class, 1);
news.setAuthor("SUN");
}
1.1.2说明
在commit的时候,会自动的执行session的flush操作即这里会执行update操作。
1.2需要手动执行update方法
1.2.1代码
这里就不等commit的时候自动执行update了,这里手动调用update语句
1.2.2说明一
无论要更新的游离对象和数据表的记录是否一致, 都会发送 UPDATE 语句.如何能让 updat 方法不再盲目的出发 update 语句呢 ?
在 .hbm.xml 文件的 class 节点设置select-before-update=true (默认为 false). 但通常不需要设置该属性.设置该属性后,在更新时会先执行一条查询语句然后比较若相同的话不执行更新操作了。
如图
1.2.3若数据表中没有对应的记录, 但还调用了 update 方法, 会抛出异常
执行如下语句就会报错
1.2.4说明
当 update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常. 因为在 Session 缓存中 不能有两个 OID 相同的对象!
如下执行就会报错
2saveorupdate语句
2.1save功能
@Test
public void testSaveOrUpdate(){
News news = new News("FFF", "fff", new Date());
session.saveOrUpdate(news);
}
上面的代码中news是将一个临时对象(无id值)所以执行的是save操作。
2.2update操作
@Test
public void testSaveOrUpdate(){
News news = new News("FFF", "fff", new Date());
news.setId(11);
session.saveOrUpdate(news);
}
上面代码中news是一个游离对象(有id值)所以执行的是update操作
2.3注意一
若 OID 不为 null, 但数据表中还没有和其对应的记录. 会抛出一个异常.
2.4 注意二
OID 值等于 id 的 unsaved-value 属性值的对象, 也被认为是一个游离对象
属性的设置方法
3delete方法与Evict方法
3.1用法一
@Test
public void testDelete(){
News news = new News();
news.setId(11);
session.delete(news);
}
3.2用法二
@Test
public void testDelete(){
News news = (News) session.get(News.class, 163840);
session.delete(news);
}
3.3说明一
若 OID 在数据表中没有对应的记录, 则抛出异常
3.4说明二
可以通过设置 hibernate 配置文件 hibernate.use_identifier_rollback 为 true,使删除对象后, 把其 OID 置为 null
3.5Evict方法
4session调用存储过程或者批量操作的时候
思路通过得到源生的jdbcconnection来继续操作,hibernate没有提供直接操作存储过程的api
@Test
public void testDoWork(){
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
System.out.println(connection);
//调用存储过程.
}
});
}
途中System.out.println(connection);就是打印了原生的connection对象