spring - CrudRepository和具有瞬态字段的bean

时间:2016-11-16 05:44:56

标签: java spring hibernate spring-boot

我有一个Spring CrudRepository,我用它来持久化实体。但是,我的实体有一些我不希望存储在数据库中的瞬态字段,但是,当我调用save()时我不想丢失它们但看起来我总是从保存中获得一个全新的,不同的对象() 方法。因此,我失去了我的瞬态价值。

如果我不使用返回的对象并继续使用我调用save()的原始对象,我只能在其上调用save()一次,否则它会抱怨实体已被另一个会话更新

任何想法如何让save()返回我的同一个对象?我应该使用不同的存储库吗?我可以添加某种注释来改变行为吗?

@Override
@Transactional
public TestRun saveTestRun(TestRun run) 
{
    logger.debug("Saving TestRun with Id: " + run.getId() + " " + run.toString());
    logger.debug("Timeout 1: " + run.getTimeout());
    run.setTimeout(10000000);  // set transient field

    logger.debug("Timeout 2: " + run.getTimeout());
    TestRun r2 = this.repository.save(run);

    logger.debug("Timeout 3: " + r2.getTimeout());

    logger.debug("Saved TestRun with Id: " + r2.getId() + " " + r2.toString() );

    return r2;
}

这会产生:

Saving TestRun with Id: 2 TestRun@4c4d810e
Timeout 1: 90
Timeout 2: 10000000
Payload no-arg constructor
TestRun constructor
TestRun no-arg constructor
Timeout 3: 90
Saved TestRun with Id: 2 TestRun@25a14d5c

2 个答案:

答案 0 :(得分:0)

  

如果我不使用返回的对象并继续使用我的   我调用save()的原始对象,我只能调用save()   曾经,否则它抱怨实体被另一个更新   会话。

如果您想在多个会话中使用相同的实体对象,或者另一个选项是使用saveOrUpdate(Object object)(返回类型{{},则可以使用session方法(Hibernate persist()) 1}}),但void(不会返回生成的ID),您可以查看here

您可以查看persist() API的here

答案 1 :(得分:0)

  

知道如何让save()返回我的同一个对象吗?

import hashlib hashlib.sha1(userinput).hexdigest() 将仅返回生成的save(object),而不是您传递给它的对象。 因此,获取identifier方法返回的identifier,然后在需要该ID时手动将其设置为对象。