我的问题在于分离的对象......
我目前正在使用Spring with Hibernate。
我有一个映射对象,它有一个主键作为字符串(我知道它很糟糕......但重构代码需要几个月),我希望坚持下去。 (我用两个属性简化了对象)
@Id
private String id;
private String pattern;
所以例如我想添加类似的东西:
[ “ID”: “myFirstPattern”, “图案”: “*”]
请注意我的主键已经设置好了。问题在于,每当我尝试持久化时,Hibernate将尝试将此对象与上下文中的任何对象(由于主键)链接,并且将无法执行此操作,因为没有。抛出一个分离的对象错误。
我做了一些研究并得出结论,merge()足以满足我的需求,因为即使对象不可用它也会持续存在并更新。但是我发现这是一个相当肮脏的解决方法,并想检查是否有任何其他解决方案来解决这个问题。
考虑到我们有一个Helper层,因此Services层不能直接与HibernateDao层一起使用。所以我可以通过添加'persist'和'update'方法来“屏蔽”它,这将调用相同的合并DAO方法。
谢谢, 弗拉维奥。
答案 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"生成器吗?