2015-09-07 81 views
2

有沒有辦法設置一些(默認)值,如果實體未找到(只有如果實體未找到 - EntityNotFound異常)?如果DB中有空值,則該字段必須爲空。 例如,我有一個實體先用關係到實體第二:JPA的默認值,如果實體沒有找到

class First { 
    ... 
    @ManyToOne @JoinColumn(name="second", nullable=true) 
    @NotFound(action = NotFoundAction.IGNORE) 
    Second second; 
    ... 
} 

如果列「第二」在DB(表「第一」)爲空,則first.second必須爲空。如果DB(表「第一個」)中的列「second」是5(第二個id = 5),並且id = 5的表「Second」中不存在行,則firts.second應該是某個默認值(實體) ,例如實體第二個id = 1或新的第二個(params);

回答

1

我希望你通過get/set方法來訪問你的字段。只是讓內吸空檢查邏輯:

public Second getRelated(){ 
    if(second == null) 
     return defaultValue; 
} 

也請看到這個答案https://stackoverflow.com/a/757330/149818

+0

是的,我使用get/set方法。但是,只有在發生EntityNotFound異常時,我才需要defaultValue。如果字段「second」爲空並且沒有異常,那麼提交的«second»應該爲null(不是defaultValue) – Vadim

+0

當您使用關係時,您將獲得空數組而不是EntityNotFound - JPA不會引發異常來解決相關問題。因此,使用空的大小檢查裏面獲取方法 – Dewfy

+0

我得到EntityNotFound當某個表包含一個鏈接到其他表不包含所需的數據 – Vadim

1
class First { 
    ... 
    @ManyToOne @JoinColumn(name="second", nullable=true) 
    @NotFound(action = NotFoundAction.IGNORE) 
    Second second; 

    @Column(name = "second", insertable = false, updatable = false) 
    private Long secondId; 

    public Second getSecond(){ 
     if (second == null && secondId != null) { 
     return defaultSecond; 
     } 
     return second; 
    } 
} 

如果你想在second場本身更改爲默認值,那麼你可以添加@PostLoad回調:

public Second getSecond(){ 
    return second; 
} 

@PostLoad 
private void postLoad() { 
    if (second == null && secondId != null) { 
     this.second = defaultSecond; 
    } 
} 
+0

這幾乎是我需要的。只是如何由另一個第二個對象(寬度不同的ID)初始化字段「第二」? – Vadim

+0

請參閱我編輯的答案。你可能會發現'@ PostLoad'回調對此很有用。 –

+0

這種方法解決了這個問題!我可以使用@PostLoad方法和Aut​​owireHelper.autowire(this,someService)設置一個新值;例如: – Vadim