我在将字节数组映射到 Hibernate 中的 MySQL 数据库时遇到了一些问题,想知道我是否遗漏了一些明显的东西。我的类(class)大致如下所示:
public class Foo {
private byte[] bar;
// Getter and setter for 'bar'
}
表在MySQL 5.5中是这样定义的:
CREATE TABLE foo (
bar BINARY(64) NOT NULL)
并且 Hibernate 3.6.2 映射看起来与此类似:
<hibernate-mapping>
<class name="example.Foo" table="foo">
<property name="bar" column="bar" type="binary" />
</class>
</hibernate-mapping>
我只使用 hbm2ddl 进行验证,当我部署应用程序时它给我这个错误:
Wrong column type in foo for column bar. Found: binary, expected: tinyblob
如果在映射中使用 type="binary"不会导致 Hibernate 期望列的类型为二进制(而不是 tinyblob),我不知道会怎样。我花了一些时间谷歌搜索这个但找不到确切的错误。类似错误的解决方案是...
- 在
上指定“长度”。这改变了 Hibernate 期望的类型,但它始终是某种类型的 blob,而不是它找到的“二进制”类型。 - 不是在属性元素上声明“类型”,而是嵌套一个列元素并赋予它一个 sql-type 属性。那行得通,但这也会使绑定(bind)特定于 MySQL,因此我想尽可能避免它。
这个设置有什么突出的地方会导致这种不匹配吗?如果我指定 type="binary"而不是 "blob",为什么 Hibernate 需要 blob 而不是二进制?
最佳答案
我认为问题出在type="binary"
。
该类型是 hibernate 的泛型类型。它不直接映射到数据库引擎特定类型。它们会根据您使用的驱动程序转换为不同的 SQL 类型。显然,MySQL 驱动程序将 hibernate 类型“二进制”映射到一个 tinyblob。
hibernate 类型的完整列表可用here .
您有 2 个选择。您可以更改 CREATE TABLE 脚本以使用 tinyblob 数据类型存储该列。那么你的 hibernate 验证就不会失败,你的应用程序就会工作。这将是建议的解决方案。
仅当您必须在数据库中使用 BINARY 数据类型时才应使用第二个选项。您可以做的是在 hibernate 映射中指定一个 sql 类型,以便您强制 hibernate 使用您想要的类型。映射看起来像这样:
<property name="bar">
<column name="bar" sql-type="binary" />
</property>
这样做的主要缺点是你失去了数据库引擎的独立性,这就是为什么大多数人首先使用 hibernate 的原因。此代码仅适用于具有 BINARY 数据类型的数据库引擎。
关于mysql - 在 Hibernate 中将 Java byte[] 映射到 MySQL binary(64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973646/