在 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 映射可以从数据库中检索对象? org.hibernate.dialect.mysql5Dialect验证false falsefalse0net.sf.ehcache.hibernate.SingletonEhCacheProvider 【参考方案1】:

您尝试过 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 中持久化对象,同时具有已知的主键。的主要内容,如果未能解决你的问题,请参考以下文章

hibernate一级和二级缓存介绍

Hibernate 中对象的三种状态及其转化

Hibernate 内容记录

hibernate持久化对象三种状态及其转换

hibernate session缓存

hibernate框架学习之对象状态