我正在尝试保存一个带有字节数组字段的实体。我在 MySQL 数据库上使用 Hibernate 和 JPA。 这是字段定义,它适用于嵌入式 H2 数据库:
@Entity(name = "blob")
public class Blob {
...
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "blobImg", nullable = false)
private byte[] blobImg;
}
现在,对于 MySQL 数据库,每次执行 blobRepository.save() 时都会抛出异常。实际上,当 Hibernate 尝试自动创建 Blob 实体表时,可能会抛出。异常(exception)情况如下:
o.h.engine.jdbc.spi.SqlExceptionHelper : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'blob (blobCols, blobImg, blobRows, channel, idBlobPersistence) values (50, _bina' at line 1
我尝试使用在网上找到的几种方法来更改字段定义:
方法一:
@Column(name = "blobImg", nullable = false, columnDefinition = "BINARY(256)", length = 256)
private byte[] blobImg;
方法二:
@Lob
@Column(name="blobImg", columnDefinition="bytea")
private byte[] blobImg;
方法 3: 在 blob.hbm.xml 文件上定义一个 hibernate 映射并从 entityManagerFactory bean 引用它:
<?xml version='1.0' encoding='UTF-8'?>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="mappingResources">
<list>
<value>blob.hbm.xml</value>
</list>
</property>
</bean>
blob.hbm.xml 映射:
<hibernate-mapping>
<class name="guiatv.persistence.domain.Blob" table="blob">
<property name="blobImgProperty">
<column name="blobImg" sql-type="binary"></column>
</property>
</class>
</hibernate-mapping>
方法 4: 将 blob.hbm.xml 映射更改为以下内容:
<?xml version='1.0' encoding='UTF-8'?>
<hibernate-mapping>
<class name="guiatv.persistence.domain.Blob" table="blob">
<property name="blobImg" type="binary">
<column name="blobImg" />
</property>
</class>
</hibernate-mapping>
它们都抛出相同的异常。
我该如何解决? 谢谢!
最佳答案
如果你想把你的byte[]
转换成sql类型的Blob
,你可以这样做:
@Lob(type = LobType.BLOB)
或
@Type(type = "org.hibernate.type.BlobType")
@Lob
希望对你有帮助
关于java - 使用 Hibernate 在 MySQL 中存储字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32572422/