在拥有已知主键的同时在Hibernate中保留对象。

时间:2011-07-28 13:58:28

标签: java hibernate spring merge persist

我的问题在于分离的对象......

我目前正在使用Spring with Hibernate。

我有一个映射对象,它有一个主键作为字符串(我知道它很糟糕......但重构代码需要几个月),我希望坚持下去。 (我用两个属性简化了对象)

@Id
private String id;

private String pattern;

所以例如我想添加类似的东西:

[ “ID”: “myFirstPattern”, “图案”: “*”]

请注意我的主键已经设置好了。问题在于,每当我尝试持久化时,Hibernate将尝试将此对象与上下文中的任何对象(由于主键)链接,并且将无法执行此操作,因为没有。抛出一个分离的对象错误。

我做了一些研究并得出结论,merge()足以满足我的需求,因为即使对象不可用它也会持续存在并更新。但是我发现这是一个相当肮脏的解决方法,并想检查是否有任何其他解决方案来解决这个问题。

考虑到我们有一个Helper层,因此Services层不能直接与HibernateDao层一起使用。所以我可以通过添加'persist'和'update'方法来“屏蔽”它,这将调用相同的合并DAO方法。

谢谢, 弗拉维奥。

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

在我尝试了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);
    }

现在,它正在按预期工作,即使它似乎会杀死我的缓存数据库存在的原因...但是这个更新功能将被谨慎使用,因为组件的主要原因是返回信息,匹配模式并返回最佳结果。

无论如何,如果我发现任何瑕疵,我很快就会回来。

任何评论,请随时发布:)

答案 2 :(得分:0)

我不确定,我现在无法自己尝试,但是没有设置@Id属性来使用"assigned"生成器吗?