Hibernate Session持久化方法实战

本文详细解释了HibernateSession中常见的持久化方法,如save、update、saveOrUpdate等的区别,并通过测试用例展示了它们的实际应用效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate Session中有一系列的持久化方法比如:[b]save, update, saveOrUpdate, persist, merge, replicate[/b]等等,经常有人问起它们之间的细微差别,而Hibernate的官方文档并没有进行详细的说明,因此以几个测试用例验证它们的不同之外。文中所使用的持久化类以及配置请参考之前写的[url=http://septem.iteye.com/blog/575130]hibernate二级缓存[/url]

[b][size=medium]一、save, update, saveOrUpdate[/size][/b]

这三个方法使用最为频繁,区别较直观,简单说一下

[b]save[/b]:持久化对象,并根据ID生成策略分配ID

[b]update(detachedInstance)[/b]:根据detachedInstance的ID更新该对象,如果当前session中存在相同ID的persistent instance会抛异常

[b]saveOrUpdate[/b]:根据对象ID的unsaved-value来决定是执行save还是update

代码:略

[b][size=medium]二、update, merge[/size][/b]

[b]merge(detachedInstance)[/b]:merge方法会将detachedInstance的属性复制到相同ID的持久化对象,并返回该持久化对象。注意这里的detachedInstance本身并不会被持久化,继续保持游离状态,这是merge与update的最大区别

测试用例如下:

@Test
public void test_update_merge(){
Session session = sessionFactory.openSession();
Author a1 = new Author();
a1.setName("septem");
session.save(a1);
session.close();

session = sessionFactory.openSession();
a1.setName("septem_new");

//Copy the state of a1 onto the persistent object a2
Author a2 = (Author) session.merge(a1);
//a1 doesn't become associated with the session
assertFalse(session.contains(a1));

assertEquals(a1.getName(), a2.getName());

session.close();
}


[b][size=medium]三、save, persist[/size][/b]

[b]persist[/b]与save不同的地方在于2点:
1.persist把对象进行持久化,但是不保证立刻生成ID,ID的生成可能被推迟到flush的时候

2.在transaction外部调用persist的时候并不触发sql Insert

测试用例如下:

@Test
public void test_persist_outside_transaction(){
Session session = sessionFactory.openSession();
Author a1 = new Author();
a1.setName("septem");
//persist outside transaction
session.persist(a1);
//ID is NOT assigned
assertNull(a1.getId());
assertTrue(session.contains(a1));
session.close();
//hibernate doesn't execute INSERT statement
assertNull(a1.getId());
}


[b][size=medium]四、lock[/size][/b]

[b]lock(Object object, LockMode lockMode)[/b]:lock方法根据LockMode获取相应的锁,并将对象持久化,它的主要作用是获取锁。

但是在实际测试的时候,发现如果对Author对象调用lock方法的时候会抛异常[b](org.hibernate.HibernateException: reassociated object has dirty collection reference)[/b],而在book对象上调用的时候则正常,猜测应该是author对象存在一对多的关系,包含了book集合,但具体原因还不清楚,有对hibernate熟悉的朋友请指点

测试用例如下:

@Test
public void test_lock_author_throw_exception(){
Session session = sessionFactory.openSession();
Author a1 = new Author();
a1.setName("septem");
session.save(a1);
session.close();

session = sessionFactory.openSession();

try {
session.lock(a1, LockMode.NONE);
fail("lock doesn't throw exception as expected");
} catch (HibernateException e) {
// org.hibernate.HibernateException: reassociated object has dirty collection reference
}
assertTrue(session.contains(a1));

session.close();
}

@Test
public void test_lock_book(){
Session session = sessionFactory.openSession();
Book book = new Book();
book.setTitle("java");
session.save(book);
session.close();

session = sessionFactory.openSession();

session.lock(book, LockMode.NONE);
// book is associated with the session
assertTrue(session.contains(book));

session.close();
}


[b][size=medium]五、replicate[/size][/b]

[b]replicate(Object object, ReplicationMode replicationMode)[/b]:在ID是自动生成的情况下,save会持久化对象,并生动分配ID。而replicate同样是持久化对象,但它允许你指定ID。如果指定ID的纪录已经存在,它会根据参数ReplicationMode来决定是抛异常,还是覆盖原来的对象或者是直接忽略持久化操作

测试的时候,我指定了一个已经存在的ID进行replicate操作,ReplicationMode为ReplicationMode.EXCEPTION,实际的情况并没有抛出异常,而是直接生成是另外一个对象,ID为自动分配,相当于对transient instance调用save方法!google了一下,发现这个方法跟底层的数据与ID生成策略有关([url=http://opensource.atlassian.com/projects/hibernate/browse/HHH-2716]参考这里[/url]),不同情况它的结果会不一样,所以在实践中还是应该慎用!
内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值