在Hibernate Usertype中访问实体ID

时间:2017-09-24 07:52:06

标签: java hibernate jpa java-ee

我创建了自己的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.

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我在代码库中遇到了同样的问题。 AFAIK,到目前为止,我唯一能找到的选择就是在您的SecureString类型中添加一个ID字段,在@ PreUpdate / @ PreLoad或其他回调中或在getter和setter / constructors中进行设置,或者使用HibernateInterceptor在任何地方进行设置适合您的生命周期。然后,您可以使用value.getId()或其他内容在nullSafeSet中对其进行访问。它的坚果,但它可以工作。