我需要哪种MySQL类型来存储常规字符串和哈希值?

时间:2015-07-28 14:01:12

标签: mysql hibernate jpa annotations bytearray

我正在使用额外的实体/表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,也可以正常工作。 的工作原因是EventnewValue = 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[]更改为存储Eventprivate byte[] previousValue似乎就足够了。反对的任何论据?

此外,MySQL输出现在看起来有点紧张:

private byte[] newValue

可能无法解决这个问题?

1 个答案:

答案 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

我希望这些信息可以帮到你。

祝你好运。