在 Hibernate 中持久化对象,同时具有已知的主键。
Posted
技术标签:
【中文标题】在 Hibernate 中持久化对象,同时具有已知的主键。【英文标题】:Persisting an object in Hibernate while having a known primary key. 【发布时间】:2011-10-15 04:00:29 【问题描述】:我的问题在于分离的对象...
我目前正在使用带有 Hibernate 的 Spring。
我有一个映射对象,它的主键为字符串(我知道这很糟糕……但重构代码需要几个月的时间),我希望保留它。 (我用两个属性简化了对象)
@Id
private String id;
private String pattern;
例如,我想添加如下内容:
["id":"myFirstPattern","pattern":".*"]
请注意,我的主键已经设置。这样做的问题是,每当我尝试坚持时,Hibernate 都会尝试将此对象与上下文中的任何对象链接(因为主键)并且不会这样做,因为没有。抛出一个分离的对象错误。
我做了一些研究并得出结论,merge() 足以满足我的需求,因为即使对象不可用,它也会持续存在并更新。但是我发现这是一个相当肮脏的解决方法,并想检查是否有任何其他解决方案可以解决此问题。
考虑到我们有一个 Helper 层,所以 Services 层不会直接与 HibernateDao 层一起工作。所以我可以通过添加将调用相同合并 DAO 方法的 'persist' 和 'update' 方法来“掩盖”这一点。
谢谢, 弗拉维奥。
【问题讨论】:
嗨 Flavio,你能发布你的休眠映射配置吗?您能否确认您的 Hibernate 映射可以从数据库中检索对象?您尝试过 saveOrUpdate 吗?
Session sess = factory.openSession();
Transaction tx;
try
tx = sess.beginTransaction();
session.saveOrUpdate( yourObjectHere );
tx.commit();
catch (Exception e)
if (tx!=null) tx.rollback();
throw e;
finally
sess.close();
【讨论】:
我尝试使用 SaveOrUpdate,但我相信我的缓存数据库与 JUnit 混淆了,因为我通过 sql 查询手动删除了一些数据。当我在之前的测试中删除它后第二次尝试保留同一个对象时,我不断收到 StaleStateException 错误。我们不太可能进行任何手动删除,但这仍然是 JUnit 存在的原因,以测试所有内容。【参考方案2】:在尝试了 Mauricio 给我的想法后,我尝试使用一些不同的方法。由于 SaveOrUpdate 使用缓存的实体来验证它是否应该更新或保存一个对象,所以我想在保存我的对象之前先明确一下。
所以,这是我的一段代码:
try
getHibernateTemplate().clear();
getHibernateTemplate().save(entity);
catch (DataAccessException e)
if (e.getCause() instanceof ConstraintViolationException)
throw new HibernateDaoException("Entity could not be persisted. Constraint violation.");
throw new HibernateDaoException(e);
目前,它正在按预期工作,即使它似乎会杀死我的缓存数据库存在的理由......但是这个更新功能将被谨慎使用,因为组件的主要原因是返回信息,匹配模式并返回最佳结果。
如果我发现任何缺陷,我会尽快返回。
任何cmets,请随时发布:)
【讨论】:
【参考方案3】:我不确定,我现在不能自己尝试,但是设置@Id 属性以使用"assigned" 生成器不正是这样做的吗?
【讨论】:
无法在@Id 中找到任何具体的内容,即使我在 GeneratedId 中找到了其他内容,等等......不知道这将如何帮助我。 GeneratedValue 策略与数据库有关吗?我以前使用过这些,但我之前的所有经验都是使用标准化数据库...以上是关于在 Hibernate 中持久化对象,同时具有已知的主键。的主要内容,如果未能解决你的问题,请参考以下文章