2016-11-16 74 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,則手動將其設置爲該對象。