如何根据Hibernate + Java请求的另一个POJO对象创建和保存新的POJO对象

时间:2017-03-11 06:39:01

标签: java database postgresql hibernate

我有一个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会认为它是新对象。我也不想手动增加它,这不是正确的方法。

1 个答案:

答案 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);