【发布时间】:2011-08-23 20:06:42
【问题描述】:
我在将字节数组映射到 Hibernate 中的 MySQL 数据库时遇到了一些问题,我想知道我是否遗漏了一些明显的东西。我的班级大致是这样的:
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 属性。那是可行的,但这也会使绑定特定于 MySQL,所以如果可能的话,我想避免它。
此设置有什么突出的地方会导致这种不匹配吗?如果我指定 type="binary" 而不是 "blob",为什么 Hibernate 需要一个 blob 而不是二进制文件?
【问题讨论】:
-
二进制类型让我对 Java/Hibernate 感到无尽的沮丧。通常我解决这个问题的方法是在 Java 端对二进制数据进行 Base64 编码,然后将其作为
TEXT字段存储在数据库中。然后你的实体中的属性可以是String类型,一切都会更加顺利。 -
是的,字节数组在 Hibernate 中似乎确实很麻烦。映射明确告诉 Hibernate 期望二进制作为类型,但它正在寻找不同类型的 blob,这不是一个错误吗?确实非常令人沮丧!
-
这不是明确告诉 Hibernate 使用二进制文件。 property 元素的 type 属性不用于指定 SQL 数据类型。我在下面的回答中对此进行了解释。我无法评论 Hibernate 在设置为使用 BINARY 数据类型(正确)时的行为方式,我没有尝试过。
-
由于 MySQL 的二进制类型似乎被 Hibnerate “孤立”了,并且变通办法似乎是映射它们的唯一方法,我将其发布到 Hibernate 论坛。 forum.hibernate.org/viewtopic.php?f=1&t=1011076 我有点希望这被认为是一个错误并在将来修复。
标签: mysql hibernate hbm2ddl hbm