mysql - 在 Hibernate 中将 Java byte[] 映射到 MySQL binary(64)

标签 mysql hibernate hbm2ddl hbm

我在将字节数组映射到 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),我不知道会怎样。我花了一些时间谷歌搜索这个但找不到确切的错误。类似错误的解决方案是...

  1. 上指定“长度”。这改变了 Hibernate 期望的类型,但它始终是某种类型的 blob,而不是它找到的“二进制”类型。
  2. 不是在属性元素上声明“类型”,而是嵌套一个列元素并赋予它一个 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/

相关文章:

java - 使用 hibernate session 获取对象而不使用事务

Hibernate hbm2ddl.auto,可能的值以及它们的作用

java - hibernate.hbm.xml 中的无效映射异常

php - 显示空表行

java - 总小时数无法从 Android 插入 MySQL

javascript - 如何使用javascript从外部文件加载php vars

java - Spring 数据 : How to write a record in join table for unidirectional one-to-may?

hibernate - ColdFusion ORMmappedSuperClass.hbmxml 有太多字段

hibernate - 序列问题为什么在使用 hbm2ddl 生成架构时两个实体共享相同的序列?

php - NOT NULL 值的 SELECT 语句返回 NULL 值。