Hibernate_2 Session及Session API

2017-10-18  本文已影响24人  mm_cuckoo

Session 介绍

Session 缓存

flush 缓存

设定刷新缓存的时间点

若希望改变 flush 的默认时间点, 可以通过 Session 的 setFlushMode() 方法显式设定 flush 的时间点

清理缓存的模式 各种查询方法 Transaction 的 commit() 方法 Session 的 flush() 方法
FlushMode.AUTO(默认模式) 清理 清理 清理
FlushMode.COMMIT 不清理 清理 清理
FlushMode.NEVER 不清理 不清理 清理

refresh()

会强制发送 SELECT 语句, 以使 Session 缓存中对象的状态和数据表中对应的记录保持一致!

@Test
public void testRefresh() {
    Student student = session.get(Student.class, 1);
    System.out.println(student);
    //在此处断点, 然后修改数据库中数据,向下执行
    session.refresh(student);
    System.out.println(student);
}

持久化对象的状态

Session API 使用

Save() 方法

/**
 * 1. save() 方法
 * 1). 使一个临时对象变为持久化对象
 * 2). 为对象分配 ID.
 * 3). 在 flush 缓存时会发送一条 INSERT 语句.
 * 4). 在 save 方法之前的 id 是无效的
 * 5). 持久化对象的 ID 是不能被修改的!
 */
@Test
public void testSave() {
    Student student = new Student("小明", 56, new Date(new java.util.Date().getTime()));
    session.save(student);
//  student.setId(200);
}
/**
 * persist(): 也会执行 INSERT 操作
 * 和 save() 的区别 : 
 * 在调用 persist 方法之前, 若对象已经有 id 了, 则不会执行 INSERT, 而抛出异常
 */
@Test
public void testPersist() {
    Student student = new Student("小明", 57, new Date(new java.util.Date().getTime()));
    //student.setId(35);
    session.persist(student);
}

get() 和 load() 方法

@Test
public void testGet() {
    //get 获取对象时立即加载
    Student student = session.get(Student.class, 1);
    System.out.println(student.getName());
}

@Test
public void testLoad() {
    //load 获取对象时,等到使用时才会加载,如果使用时加载的对象不存在,就会抛出 ObjectNotFoundException 异常
    Student student = session.load(Student.class, 100);
    System.out.println(student.getName());
}

update() 方法

<class name="com.cfox.hibernate.Student" table="STUDENT_INFO" select-before-update="true">
/**
 * update:
 * 1. 若更新一个持久化对象, 不需要显示的调用 update 方法. 因为在调用 Transaction
 * 的 commit() 方法时, 会先执行 session 的 flush 方法.
 * 2. 更新一个游离对象, 需要显式的调用 session 的 update 方法. 可以把一个游离对象
 * 变为持久化对象
 * 
 * 需要注意的:
 * 1. 无论要更新的游离对象和数据表的记录是否一致, 都会发送 UPDATE 语句. 
 *    如何能让 updat 方法不再盲目的出发 update 语句呢 ? 在 .hbm.xml 文件的 class 节点设置
 *    select-before-update=true (默认为 false). 但通常不需要设置该属性. 
 * 
 * 2. 若数据表中没有对应的记录, 但还调用了 update 方法, 会抛出异常
 * 
 * 3. 当 update() 方法关联一个游离对象时, 
 * 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常. 因为在 Session 缓存中
 * 不能有两个 OID 相同的对象!
 *    
 */
@Test
public void testUpdate() {
    
    Student student = session.get(Student.class, 1);
    student.setName("AAA");
    session.close();
    session = sessionFactory.openSession();
    Student student1 = session.get(Student.class, 1);
    session.update(student);
}

saveOrUpdate() 方法

执行流程图
@Test
public void testSaveOrUpdate() {
    Student student = new Student("小li", 35, new java.util.Date());
    session.saveOrUpdate(student);
}

delete() 方法

/**
 * delete: 执行删除操作. 只要 OID 和数据表中一条记录对应, 就会准备执行 delete 操作
 * 若 OID 在数据表中没有对应的记录, 则抛出异常
 * 
 * 可以通过设置 hibernate 配置文件 hibernate.use_identifier_rollback 为 true,
 * 使删除对象后, 把其 OID 置为  null
 */
@Test
public void testDelete() {
    Student student = session.get(Student.class, 2);
    session.delete(student);
    
    System.out.println(student.toString());
}

doWork(Work) 方法

通过 Hibernate 调用存储过程

public interface Work {
    void execute(Connection connection) throws SQLException;
}
@Test
public void testDoWork() {
    Work work = new Work() {
        // 通过jdbc API 来访问数据库
        @Override
        public void execute(Connection connection) throws SQLException {
            System.out.println(connection); 
        }
    };
    session.doWork(work);
}

Hibernate 与触发器协同工作

上一篇 下一篇

猜你喜欢

热点阅读