簡體   English   中英

將字節數組存儲在 MySQL 和 Hibernate

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM