没有合适的资源?快使用搜索试试~ 我知道了~
Hibernate对数据库操作的一些理解.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 140 浏览量
2022-07-14
08:07:55
上传
评论
收藏 29KB PDF 举报
温馨提示
试读
20页
Hibernate对数据库操作的一些理解.pdf
资源推荐
资源详情
资源评论
1. 连接一个数据库, 相当于开启一个 session.在事务没有提交之前, 可以做各种操作, save
之后对象变为持久化( persistence)的,并分配主键,持久化之后,任何改动 (比如 set
一个字段 )会和数据库同步,但是这时没有真正的改变数据库,而是在会话之中。当
commit 之后,才会发出 sql 语句,数据库才真正的改变,注意在 commit 时, session 会
进行缓存的脏数据检查然后再发送 sql 语句。直到 session.close.对象才变成 detache 状态,
但是该对象在数据库有相对应的记录。如果此对象继续进行 save()或则 update()操作,
还会变为 persistence 对象。下面是一个例子:
public void testSave1() {
Session session = null;
Transaction tx = null;
User user = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//Transient 状态
user = new User();
user.setName("李四 ");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//persistent 状态 ,当属性发生改变的时候, hibernate 会自动和数据库同步
session.save(user);
user.setName("王五 ");
//session.update(user);
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
//detached 状态
user.setName("张三 ");
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//persistent 状态
session.update(user);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
2. 如果 new 一个对象,set 主键是数据库已有的记录, 那么这是手动构建的 detached 对象。
public void testUpdate1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
// 手动构造的 detached 状态的对象
User user = new User();
user.setId("402880d01b9be8dc011b9be9b23d0001");
user.setName("德华 ");
session.update(user);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
3. 对于 get 查询和 load 查询。 Get 查询如果数据库没有匹配记录,将会返回一个空对象。
如果是 load 加载,则在查询的时候不发 sql 语句, 不查询, 只是用 cglib 继承实体,返回
一个代理类,然后当用到查询的对象的方法时,在进行查询,只是 lazy 加载(懒加载或
者延时加载) 。如果数据库没有匹配的记录,那么会抛出异常。
4. Hibernate+Spring 后事务的个人理解:
比如通过 Spring 对增加的方法设定 REQUIRED传播特性。 那么当创建 session的时候, 如
果没有事务,会开启一个事务。如果有事务,则继续使用该事务。 Session创建相当于开
启了一个数据库连接, 让 session.commit 会向数据库发送 sql 语句,这时是比较费时的。
当 session.close 的时候,
close()
方法重要的暗示是,
session
释放了 JDBC连接。
5. 对于 Hibernate 一级缓存的个人理解: 一级缓存是 session 的缓存, 缓存里存的是对象实
体。持久化对象在执行 save(),update(),get ()等等都会发出 sql 语句。
例子:
public class CacheLevel1Test extends TestCase {
/**
* 在同一个 session中发出两次 load 查询
*/
public void testCache1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//load 支持 lazy加载,执行到 student.getName()才发出 sql 语句,
Student student = (Student)session.load(Student.class, 2);
System.out.println("student.name=" + student.getName());
// 不会发出 sql,因为 load 使用缓存
student = (Student)session.load(Student.class, 2);
System.out.println("student.name=" + student.getName());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 在同一个 session中发出两次 get 查询
*/
public void testCache2() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Student student = (Student)session.get(Student.class, 2);
System.out.println("student.name=" + student.getName());
// 不会发出 sql,因为 get 使用缓存
student = (Student)session.get(Student.class, 2);
System.out.println("student.name=" + student.getName());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
剩余19页未读,继续阅读
资源评论
ll17770603473
- 粉丝: 0
- 资源: 6万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功