2012-07-15 45 views
0

有沒有辦法標記某些屬性不能檢索?hibernate - 強制屬性不能從數據庫加載

我有我的用戶表內的一個獨特的胡椒行,我不希望加載這個胡椒和哈希密碼,如果用戶檢索。

我沒有對任何需要在遠程客戶端上的,所以我想確保它不會意外地傳遞給它。

如果我需要重新生成或在應用服務器上更改了密碼,我可以通過命名查詢檢索胡椒。

+1

沒有創建一個dto傳輸,沒有胡椒粉和密碼散列會解決你的問題? – Firo 2012-07-15 16:48:20

+0

它會,但我發送實體類到客戶端。我目前在發送前將這些值設置爲空。 – djmj 2012-07-15 17:28:35

+0

發送實體會比您想象的更早發生問題(http://stackoverflow.com/q/1688473/671619),並且viewdata通常與實體不同 – Firo 2012-07-15 18:34:38

回答

1

你可能實施攔截並覆蓋onLoad方法:More Information on Hibernate Interceptors Here

我已經使用這個策略重寫onFlushDirty和方法的onSave更新時間戳字段。我在onLoad期間從未使用過它。

這裏是基於類似的一個我已經使用(未測試)的示例攔截:

public final class PepperInterceptor extends EmptyInterceptor { 

    /** The Value to set as the Pepper field when loading from the DB. */ 
    private static final String DEFAULT_PEPPER = "[PROTECTED-PEPPER]"; 

    @Override 
    public boolean onLoad(final Object entity, final Serializable id, final Object[] currentState, 
      final Object[] previousState, final String[] propertyNames, final Type[] types) { 


     if (entity instanceof User) { 
      for (int i = 0; i < propertyNames.length; i++) { 
       if (propertyNames[i].equalsIgnoreCase("pepper")) { 
        currentState[i] = DEFAULT_PEPPER; 
       } 
      } 

      return true; 
     } 
     return super.onLoad(entity, id, currentState, previousState, propertyNames, types); 
    } 

}


編輯:

想到這些此外,您必須確保該值不會被DEFAULT_PEPPER覆蓋,可能在你的實體類的列定義中使用updatable=false之類的東西

+0

會看看這個,但它看起來非常開銷,特別是如果有更多的實體需要控制。 +1更新= false! – djmj 2012-07-17 23:54:21