[英]Store byte array in MySQL with Hibernate
我正在嘗試保存一個帶有字節數組字段的實體。 我在 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 實體表時,可能會拋出此錯誤。 例外情況如下:
ohengine.jdbc.spi.SqlExceptionHelper:您的 SQL 語法有誤; 查看與您的 MySQL 服務器版本對應的手冊,了解在第 1 行的“blob (blobCols, blobImg, blobRows, channel, idBlobPersistence) values (50, _bina') 附近使用的正確語法
我嘗試使用在 web 上找到的幾種方法來更改字段定義:
方法一:
@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
希望能幫助到你
好,
我已經嘗試過你的建議@Ernusc。 第一個:
@Lob(type = LobType.BLOB)
private byte[] blobImg;
它對我來說沒有編譯。 它可能是我的Hibernate版本與您的不同。 關於第二個選項:
@Type(type = "org.hibernate.type.BlobType")
@Lob
private byte[] blobImg;
它確實編譯,但它在運行時失敗。 它顯示以下錯誤:
2015-09-14 23:21:01.324 WARN 7436 --- [bTaskExecutor-3] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1064, SQLState: 42000
2015-09-14 23:21:01.324 ERROR 7436 --- [bTaskExecutor-3] 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 blob0_ where blob0_.idBlobPersistence=326' at line 1
2015-09-14 23:21:01.337 INFO 7436 --- [bTaskExecutor-3] o.h.e.internal.DefaultLoadEventListener : HHH000327: Error performing load command : org.hibernate.exception.SQLGrammarException: could not extract ResultSet
此外,當我嘗試跟蹤跟蹤時,我發現它實際上拋出了以下異常:
java.lang.ClassCastException: [B cannot be cast to java.sql.Blob
然后我意識到第一個錯誤消息實際上是由我將我的實體命名為“blob”的愚蠢想法引起的,這可能是Hibernate中的保留關鍵字。 所以我改變了實體聲明:
@Entity(name = "blob")
public class Blob {
...
}
至:
@Entity(name = "blobframe")
public class Blob {
...
}
然后,你的第二個建議只是拋出ClassCastException異常。 但是,我之前嘗試過的一些方法現在可以正常工作。 例如:
@Column(name = "blobImg", nullable = false, columnDefinition = "BINARY(256)", length = 256)
private byte[] blobImg;
更新:這種方法對我不起作用。 它使用以下字段定義創建blobframe表失敗(但不知道原因):
@Lob
@Column(name="blobImg", columnDefinition="bytea")
private byte[] blobImg;
感謝Ernusc的快速回復。
@Lob
@Column(name="image_column", columnDefinition="BLOB")
private byte[] image;
您可以簡單地將columnDefinition
設置為BLOB
類型。 這適用於 MySQL 並將生成blob
類型的列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.