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

|| 我在将字节数组映射到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),我不知道会怎样。我花了一些时间在Google上搜索,但找不到确切的错误。类似错误的解决方案是... 在<属性>上指定\“ length \”。这改变了Hibernate期望的类型,但是它总是某种形式的Blob,而不是它找到的\“ binary \”类型。 不必在属性元素上声明\ type,而是嵌套一列元素,并为其赋予sql-type属性。这项工作,但是那也将使绑定特定于MySQL,因此,如果可能的话,我想避免这样做。 关于此设置的任何突出之处都会导致这种不匹配?如果我指定type = \“ binary \”而不是\“ blob \”,为什么Hibernate期望使用blob而不是二进制文件?     
已邀请:
我相信问题是四英镑。 该类型是休眠的通用类型。它不会直接映射到特定于DB引擎的类型。它们会根据您使用的驱动程序转换为不同的SQL类型。显然,MySQL驱动程序将休眠类型\“ binary \\”映射到tinyblob。 休眠类型的完整列表在这里。 您有2个选择。您可以更改CREATE TABLE脚本,以使用tinyblob数据类型存储该列。这样,您的休眠验证就不会失败,并且您的应用程序将可以运行。这将是建议的解决方案。 仅当您必须在数据库中使用BINARY数据类型时,才应使用第二个选项。您可以做的是在休眠映射中指定一个sql-type,以便您强制休眠使用所需的类型。映射如下所示:
<property name=\"bar\">
  <column name=\"bar\" sql-type=\"binary\" />
</property>
这样做的主要缺点是您失去了DB引擎的独立性,这就是为什么大多数人首先使用休眠的原因。此代码仅适用于具有BINARY数据类型的数据库引擎。     
为了解决与此类似的问题,我们最终要做的是编写我们自己的自定义UserType。 UserType相对容易实现。只需创建一个实现org.hibernate.usertype.UserType的类并实现@override方法。 在您的休眠定义中,使用用户类型非常简单:
<property name=\"data\" type=\"com.yourpackage.hibernate.CustomBinaryStreamUserType\" column=\"binary_data\" />
简而言之,这将执行该类以从数据库读取和写入数据。具体来说,使用方法nullSafeGet和nullSafeSet。 在我们的例子中,我们使用它来gzip压缩二进制数据,然后再将其写入数据库,并在读取时解压缩。这掩盖了使用该数据从应用程序压缩数据的事实。     
我认为在休眠中映射Binary列有一个简单的解决方案。 \“ BINARY \”列可以很容易地映射到休眠实体类中的\“ java.util.UUID \”。 例如列定义看起来像
`tokenValue` BINARY(16) NOT NULL
Hibernate Entitiy将具有以下代码来支持BINARY列
private UUID tokenValue;

@Column(columnDefinition = \"BINARY(16)\", length = 16)
public UUID getTokenValue() {
    return this.tokenValue;
}

public void setTokenValue(UUID sessionTokenValue) {
    this.tokenValue = tokenValue;
}
    

要回复问题请先登录注册