我创建了自己的hibernate UserType实现类,它按预期工作。
我现在有一个要求,我需要访问" id"的值。我的Hibernate UserType实现类中的特定实体记录的字段(通过序列生成)。是否有可能实现这一目标?
以下是我的UserType实现:
public class SecureStringType implements UserType {
@Override
public int[] sqlTypes() {
return new int[] { Types.VARCHAR };
}
@Override
public Class returnedClass() {
return SecureString.class;
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner)
throws SQLException {
String encryptedValue = rs.getString(names[0]);
getDataSecurityService().getActualValue(encryptedValue);
SecureString secureString = new SecureString();
secureString.setActualValue(decryptedValue);
return secureString;
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session)
throws SQLException {
if (value == null) {
st.setNull(index, Types.VARCHAR);
} else {
SecureString actualValue = (SecureString) value;
st.setString(index, getDataSecurityService().encrypt(actualValue ));
}
}
// DeepCopy, disassemble, assemble method implementations
}
我注意到SharedSessionContractImplementor
里面有PersistentContext
,其中包含已加载的所有实体的列表,但我没有办法确定要调用哪个实体的UserType 。
`session.getPersistenceContext().getEntitiesByKey();` has all the `EntityKey` objects but I need to get the one for which this `UserType` is being called currently.
有什么想法吗?
答案 0 :(得分:0)
我在代码库中遇到了同样的问题。 AFAIK,到目前为止,我唯一能找到的选择就是在您的SecureString类型中添加一个ID字段,在@ PreUpdate / @ PreLoad或其他回调中或在getter和setter / constructors中进行设置,或者使用HibernateInterceptor在任何地方进行设置适合您的生命周期。然后,您可以使用value.getId()或其他内容在nullSafeSet中对其进行访问。它的坚果,但它可以工作。