/**
* 测试uuid主键生成策略
*/
public static void testSave01() {
Session session = null;
try {
//
session = HibernateSessionFactory.getSession();
session.beginTransaction();
Users user = new Users();
//
user.setUserName("龙哥");
user.setUserPassowrd("123123");
// 由于user的主键生成侧路采用的是uuid,所以调用完save后,只是将user纳入到了session
// 的管理中不会发生insert语句,但是id已经生成。
session.save(user);
// 调用flush,hibernate会清理缓存,执行sql.
session.flush();
// 默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateSessionFactory.closeSession();
}
}
/**
* 测试native主键生成策略
*/
public static void testSave02() {
Session session = null;
try {
//
session = HibernateSessionFactory.getSession();
session.beginTransaction();
Users user = new Users();
// 因为user的主键生成策略为native,所以调用session.save后,
// 将执行insert语句,返回数据库生成的Id
user.setUserName("龙哥");
user.setUserPassowrd("123123");
session.save(user);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateSessionFactory.closeSession();
}
}
/**
* 测试uuid主键生成策略
*/
public static void testSave03() {
Session session = null;
try {
//
session = HibernateSessionFactory.getSession();
session.beginTransaction();
Users user = new Users();
//
user.setUserName("龙哥");
user.setUserPassowrd("123123");
// 由于user的主键生成侧路采用的是uuid,所以调用完save后,只是将user纳入到了session
// 的管理中不会发生insert语句,但是id已经生成。
session.save(user);
// 将user对象从session中逐出,即session中existsInDatebase状态为false.
session.evict(user);
// 无法成功提交因为hibernate在清理缓存时在session的insertions集合中取出user对象进行insert操作后
// 需要更新entityEntries属性中的existsInDatabase为true而我们采用evict
// 已经将user从session的entityEntries
// 中逐出了所以找不到相关数据无法更新抛出异
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateSessionFactory.closeSession();
}
}
/**
* 测试uuid主键生成策略
*/
public static void testSave04() {
Session session = null;
try {
//
session = HibernateSessionFactory.getSession();
session.beginTransaction();
Users user = new Users();
// 因为user的主键生成侧路采用的是uuid所以调用完成save后只是将user纳入到了session的管理
// 不会发出insert语句但是id已经生成session中existsInDatebase状态为false
session.save(user);
// flush后hibernate会清理缓存会将user对象保存到数据库中将session中的insertions中的user对象
// 清除并且设置session中existsInDatebase的状态为true
session.flush();
// 将user对象从session中逐出即session的EntityEntries属性中逐出
session.evict(user);
// 可以成功提交因为hibernate在清理缓存时在session的insertions集合中无法找到user对象
// 所以就不会发出insert语句也不会更新session中的existsInDatabase的状
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateSessionFactory.closeSession();
}
}
/**
* 测试native主键生成策略
*/
public static void testSave05() {
Session session = null;
try {
//
session = HibernateSessionFactory.getSession();
session.beginTransaction();
Users user = new Users();
// 因为user的主键生成策略为native,所以调用session.save后,
// 将执行insert语句,返回数据库生成的Id
user.setUserName("龙哥");
user.setUserPassowrd("123123");
/**
* 因为user的主键生成策略为native,所以调用session.save后,将执行sql
* 返回数据生成Id,纳入了session管理 修改了session中existsIndatebase状态为true
*
*/
session.save(user);
/**
* 将user对象从session中逐出,即session的EntityEntire属性中逐出
*/
session.evict(user);
/**
* 可以成功提交因为在hibernate在清理缓存时,在session的insertions集合中无法找到user对象。
*/
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateSessionFactory.closeSession();
}
}
转载:http://www.open-open.com/doc/view/3acb087888bc417795a35db99b2a5b2c
Hibernate_主键生成策略
最新推荐文章于 2021-02-24 06:08:05 发布