7

我的问题是与分离的对象...

我目前正在使用 Spring 和 Hibernate。

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

@Id
private String id;

private String pattern;

因此,例如,我想添加如下内容:

["id":"myFirstPattern","pattern":".*"]

请注意,我的主键已经设置。这样做的问题是,每当我尝试坚持时,Hibernate 都会尝试将此对象与上下文中的任何对象链接(因为主键)并且不会这样做,因为没有。抛出一个分离的对象错误。

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

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

谢谢,弗拉维奥。

4

3 回答 3

1

Have you tried 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();
}
于 2011-07-28T21:37:50.530 回答
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);
    }

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

无论如何,如果我发现任何缺陷,我会很快回来。

任何意见,请随时发表:)

于 2011-07-29T14:19:04.853 回答
0

我不确定,我现在不能自己尝试,但不设置@Id 属性以使用“已分配”生成器就可以做到这一点吗?

于 2011-07-29T03:37:07.543 回答