hibernate - 强制不从数据库加载属性

时间:2012-07-15 15:43:37

标签: hibernate properties

有没有办法标记某些属性根本无法检索?

我的用户表中有一个独特的胡椒行,如果检索到用户,我不想加载这个胡椒和散列密码。

我对远程客户端没有任何需求,所以我想确保它不会被意外传递给它。

如果我需要在应用程序服务器上重新生成或更改密码,我可以通过命名查询检索辣椒。

2 个答案:

答案 0 :(得分:1)

您可以实现拦截器并覆盖onLoad方法:More Information on Hibernate Interceptors Here

我使用此策略覆盖onFlushDirty和onSave方法来更新Timestamp字段。我在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之类的内容

答案 1 :(得分:0)