问题是提供加密某些实体属性的能力。
由于实体是 groovy 类并在运行时生成,因此我在 setter 中合并了加密逻辑,在 getter 中合并了解密逻辑。但似乎休眠希望 Getter/Setter 是对称的。session.save() 调用 getter 在内部设置值,因此它总是将解密的版本保存到数据库中。
这是 Hibernate 的默认行为吗?有没有办法规避这个问题?
问题是提供加密某些实体属性的能力。
由于实体是 groovy 类并在运行时生成,因此我在 setter 中合并了加密逻辑,在 getter 中合并了解密逻辑。但似乎休眠希望 Getter/Setter 是对称的。session.save() 调用 getter 在内部设置值,因此它总是将解密的版本保存到数据库中。
这是 Hibernate 的默认行为吗?有没有办法规避这个问题?
您需要在这里使用 GORM 事件。在插入数据库之前进行加密
def beforeInsert() {
if (encProperty != null) {
encProperty = customEncrypt(encProperty)
}
}
从数据库读取后解密:
def afterLoad() {
if (encProperty != null)
encProperty = customDecrypt(encProperty )
}
利用def beforeUpdate()
更新期间的加密。
参考: http: //grails.org/doc/latest/guide/GORM.html#5.5.1%20Events%20and%20Auto%20Timestamping
每当您想在数据库中的内容和持久实体中的内容之间进行一些调整时,执行此操作的方法是使用自定义用户类型。我已经将它用于确保保存的字符串用空格填充之类的事情。它比向 getter 和 setter 中添加代码的侵入性要小得多,并且您避免了由于 Hibernate 认为您已经进行了更改而导致的意外保存问题。