2013-12-11 67 views
0

我有一個臨時布爾成員,應該設置爲true時,我從數據庫中檢索實體,但它應該是假的時候,我創建一個新的對象,直到它被持久化。它保存到數據庫後,該成員應該成爲true。 有一種方法可以使hibernate自動管理它,還是應該在管理器中執行它? 希望以下代碼能夠闡明我的需求。暫時成員的休眠默認值

class MyEntity(){ 
    @Id 
    Integer id; 

    @Transient 
    boolean required; 
} 

class Test(){ 
    MyEntity entity1 = new MyEntity(); 
    assertFalse(entity1.required); 

    persist(entity1); 
    assertTrue(entity1.required); 

    MyEntity entityAlreadySaved = getMyEntityWithID(1); 
    assertTrue(entityAlreadySaved.required); 
} 
+0

你似乎不明白瞬態是 - 這是一種告訴持久化提供者(在這種情況下是Hibernate)「忽略這個屬性」的方法。所以基本上你會告訴它忽略這個領域,然後你期望它能夠看到它。可憐的Hibernate! – Gimby

回答

2

你不需要這個領域,因爲你可以從它的id告訴我們,如果一個實體已經持續與否。如果idnull它是新的,否則它不是。

你只需要一個方法,如果你真的需要它,它會檢查id字段的存在。

在大多數情況下,建議在@Id旁邊使用@GeneratedValue,這樣Hibernate會爲您處理標識符。

如果您確實需要該字段,請使用id字段在構造函數或setter方法中設置其值(取決於Hibernate使用的內容)。

+0

感謝您的提示,但問題是,用戶應該看到所有MyEntity在一個表(gui)與檢查檢查,如果需要和其他未選中。如果不再需要一個MyEntity,用戶應該取消選中,並且該對象應該從db中刪除(在管理器中完成)。 – holap

+0

setId永遠不會被調用,並且沒有構造函數改變id。不知道它在哪裏設置。無論如何,我改變了邏輯。根據需要總是如此,但在crud gui中,我在構造函數中將其設置爲true,並且僅在爲配置目的而創建的bean上進行更改。這解決了我所有的問題。但它很醜。正確的解決方案將被刪除,因爲它是多餘的。比gui應該使用裝飾MyEntity的代理並添加需要設置的適當值。該字段將由gui管理,不會混淆服務器代碼和難題程序員。謝謝您的幫助。 – holap

0

Basicaly Hibernate不會處理@Transient字段。所以你必須處理好自己。
默認情況下,布爾變量爲false。如果你想設置,將TURE你必須WIRTE基於亞當邏輯回答
例如

class MyEntity{ 
@Id 
Integer id; 

@Transient 
boolean required; 

public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public boolean isRequired() { 
    if (getId() == null){ 
     setRequired(false); 
    }else{ 
     setRequired(true); 
    } 
    return required; 
} 

public void setRequired(boolean required) { 
    this.required = required; 
} 

}
你必須處理刪除邏輯seperatly

+0

謝謝,正如Adam對我的回答所評論的那樣,我不能這樣做,但是我沒有解釋這是我的錯。無論如何,我明白,我必須管理這一點。 – holap