我有一个Java Web应用程序。它确实使用hibernate
来创建,更新,将Web表单数据保存到数据库。任务是根据以前的记录在同一个表中的数据库中创建新记录。所以,我现在拥有的:
代码:
//Function which returns a record from database based on UUID
@Override
public Marriage getMarriageUuId(String uuId) {
Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(Marriage.class);
criteria.add(Restrictions.eq( "uuId", uuId ));
return (Marriage) criteria.uniqueResult();
}
//function which does save new record
@Override
public Integer addMarriage(Marriage marry) {
Session session = sessionFactory.getCurrentSession();
return (Integer) session.save(marry);
}
//the action itself
Marriage newVersion= caseRegisterService.getMarriageUuId(marriage4.getUuId());
newVersion.setVoided(false);
newVersion.setState("3.EDIT");
newVersion.setVersion(oldVersion.getVersion()+1);
newVersion.setUuId(newUuId);
caseRegisterService.addMarriage( newVersion );
我有UUID
并基于此我从数据库中获取一些记录并将其分配给相应的对象。它没有设置为主键。主键只是postgresql
中的自动增量。代码可以工作,但它只是用新数据不断更新当前对象。相反,我想用新数据和以前的数据在数据库中创建新记录。如果我是第一次创建它,当它在数据库中不存在时,它会创建该对象,但之后它会不断更新它。
根据我的理解,问题出在primary key
。因此,当我从数据库中取回对象时,它会返回唯一的primary key
,结果hibernate
只会更新它。那么,如何reset
primary key
新对象?所以,hibernate
会认为它是新对象。我也不想手动增加它,这不是正确的方法。
答案 0 :(得分:0)
据我所知,当我们有这样的事情时:
// open session, transaction
Marriage newVersion= caseRegisterService.getMarriageUuId(marriage4.getUuId());
newVersion.setVoided(false);
newVersion.setState("3.EDIT");
// close session, transaction
即使您没有调用newVersion
方法,Hibernate也会更新uuId
(旧update()
)会话刷新的原因。
那么你可以尝试做什么:
Marriage newVersion= caseRegisterService.getMarriageUuId(marriage4.getUuId());
// detach entity from session
session.evict(newVersion);
newVersion.setVoided(false);
newVersion.setState("3.EDIT");
newVersion.setVersion(oldVersion.getVersion()+1);
// reset primary key
newVersion.setId(null);
caseRegisterService.addMarriage( newVersion );
您可以使用更简单的代码来加载实体:
session.get(Marriage.class, uuId);