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

hibernate-强制不从数据库加载属性,hibernate,properties,Hibernate,Properties,有没有一种方法可以将某些属性标记为根本无法检索 我的用户表中有一个唯一的pepper行,如果检索到用户,我不想加载这个pepper和哈希密码 我在远程客户端上不需要它,因此我希望确保它不会意外地传递给它 如果我需要在应用服务器上重新生成或更改密码,我可以通过命名查询检索密码。Hibernate允许根据需要重写生成的sql @Loader注释可能有用。您可以实现拦截器并覆盖onLoad方法: 我使用这个策略覆盖onFlushDirty和onSave方法来更新时间戳字段。我从未在onLoad期间使

有没有一种方法可以将某些属性标记为根本无法检索

我的用户表中有一个唯一的pepper行,如果检索到用户,我不想加载这个pepper和哈希密码

我在远程客户端上不需要它,因此我希望确保它不会意外地传递给它


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

Hibernate允许根据需要重写生成的sql


@Loader注释可能有用。

您可以实现拦截器并覆盖
onLoad
方法:

我使用这个策略覆盖onFlushDirty和onSave方法来更新时间戳字段。我从未在
onLoad
期间使用过它

下面是一个基于我使用过的类似拦截器(未测试)的示例拦截器:

公共最终类PepperInterceptor扩展了EmptyInterceptor{
/**从DB加载时设置为Pepper字段的值*/
私有静态最终字符串默认值_PEPPER=“[PROTECTED-PEPPER]”;
@凌驾
公共布尔onLoad(最终对象实体,最终可序列化id,最终对象[]当前状态,
最终对象[]先前状态,最终字符串[]属性名称,最终类型[]类型){
if(用户的实体实例){
for(int i=0;i
}


编辑:


进一步考虑这一点,您必须确保值永远不会被
默认值\u PEPPER
覆盖,可能在实体类的列定义中使用类似于
updateable=false
的内容,这不会为传输创建一个没有PEPPER和passwordhash的dto来解决您的问题吗,但我正在将实体类发送到客户端。在发送之前,我现在将这些值设置为NULL。发送实体导致问题比您想象的要快(),而且VIEW DATA经常与实体不同,这似乎是个好主意,并且我将明确地考虑在客户端视图(Shop)中使用这些数据。但在我的数据库后端使用实体节省了大量编程时间。我将对此进行研究,但它看起来开销很大,特别是如果有更多的实体需要控制的话+1表示更新=错误
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);
    }