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