2016-11-16 27 views
1

我有一个Spring CrudRepository,我用来坚持一个实体。但是,我的实体有一些暂时的字段,我不想将它们存储在数据库中,但是,当我调用save()时,我不想丢失它们,但是看起来我总是从保存中得到一个全新的,不同的对象() 方法。因此我失去了我的短暂价值。spring - CrudRepository和豆与瞬态字段

如果我不使用返回的对象并继续使用我调用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 [email protected] 
Timeout 1: 90 
Timeout 2: 10000000 
Payload no-arg constructor 
TestRun constructor 
TestRun no-arg constructor 
Timeout 3: 90 
Saved TestRun with Id: 2 [email protected] 

回答

0

如果我不使用时返回,只是继续使用我的 原始对象,我叫上保存()的对象,我只能调用save() 一次,否则它会抱怨该实体被另一个 会话更新。

可以使用(Hibernate的sessionsaveOrUpdate(Object object)方法,如果你想在多个会话使用同一个实体对象或另一种选择是使用persist()(返回类型void),但与persist()(生成的ID不会你可以看看here

你可以看看heresession API。

+0

好的 - 所以我使用org.springframework.data.repository.CrudRepository来与Hibernate进行交互。所以我很清楚,它没有持久化方法,所以我需要直接处理Hibernate Session并执行保存和/或持久化方法? 只要尽可能地尽量使用Spring提供的开箱即用框架,但是如果我需要与Hibernate会话交谈,我可以。 –

0

任何想法如何让save()返回我同一个对象吗?

save(object)将仅返回生成的identifier而不是您传递给它的对象。 因此得到save方法返回的identifier,如果需要该ID,则手动将其设置为该对象。