我正在使用额外的实体/表Event
记录我的JPA实体的更改:
@Entity
public class Event {
private String fieldName;
@Lob
@Column
private String previousValue;
@Lob
@Column
private String newValue;
// ...
}
现在,我正在观看的领域可以有各种类型。如果它们不是字符串,但是比如@ManyToMany
集合,我在保存之前构建有用的字符串表示 - 这一切都很好。
唯一的问题是我的User
实体,其中包含字段byte[] passwordHash
。在MySQL表中,它存储为tinyblob
,也可以正常工作。 不的工作原因是Event
与newValue = new String(passwordHash, StandardCharsets.UTF_8)
持续存在。它显然变成了所有的胡言乱语,我得到以下错误:
Hibernate: insert into DbEvent (timestamp, fieldName, modelId, modelName, newValue, previousValue) values (?, ?, ?, ?, ?, ?)
15:38:25,466 TRACE BasicBinder:81 - binding parameter [1] as [TIMESTAMP] - [Tue Jul 28 15:38:25 CEST 2015]
15:38:25,466 TRACE BasicBinder:81 - binding parameter [2] as [VARCHAR] - [passwordHash]
15:38:25,466 TRACE BasicBinder:81 - binding parameter [3] as [BIGINT] - [17]
15:38:25,467 TRACE BasicBinder:81 - binding parameter [4] as [VARCHAR] - [User]
15:38:25,467 TRACE BasicBinder:81 - binding parameter [5] as [CLOB] - [G�S�G��M��j�I��
F/�-]
15:38:25,467 TRACE BasicBinder:69 - binding parameter [6] as [CLOB] - [null]
15:38:25,468 WARN SqlExceptionHelper:144 - SQL Error: 1366, SQLState: 22001
15:38:25,468 ERROR SqlExceptionHelper:146 - Data truncation: Incorrect string value: '\xEF\xBF\xBD\x17S\xEF...' for column 'newValue' at row 1
所以我的问题将是:
我需要哪些注释或类型才能工作?你看我已经尝试了@Lob
(MySQL类型longtext
),因为我首先认为这个值太长了,但它没有帮助。我猜它与字符编码有关。我如何让MySQL不关心它?可以/我应该只将String
的{{1}}字段更改为Event
吗?
有没有办法实现这个目标?
如果我的案件不清楚或者您需要更多信息才能解决此问题,请告知我们。我希望有人可以帮助我:)。
提前致谢!
[更新]
好的,因此将byte[]
更改为存储Event
和private byte[] previousValue
似乎就足够了。反对的任何论据?
此外,MySQL输出现在看起来有点紧张:
private byte[] newValue
可能无法解决这个问题?
答案 0 :(得分:0)
将它们保存为String。我建议使用Base 64编码方法,例如:
import org.apache.commons.codec.binary.Base64;
...
public static byte[] base64ToByte(String data) {
Base64 decoder = new Base64();
return decoder.decode(data);
}
public static String byteToBase64(byte[] data) {
Base64 endecoder = new Base64();
return endecoder.encodeToString(data);
}
...
当我需要保存哈希值,保存哈希值,将它们编码为Base64以及需要比较哈希值时,我总是使用这些方法,然后解码为字节数组,因为最佳实践要求您必须比较哈希以字节为单位。
Base64类是commons-codec- [version] .jar的一部分,我有1.10版本,但我可以找到你可以找到它的链接,也许有更新的版本。
http://mvnrepository.com/artifact/commons-codec/commons-codec
我希望这些信息可以帮到你。
祝你好运。