2016-02-09 74 views
0

在現有的Java EE應用程序中,存在包含字符串數組作爲字段的JPA實體。不好,但它是什麼。沒有任何註釋,並在Hibernate(在JBoss EAP 6.1 Alpha和MySQL 5.6上)運行應用程序結果將其存儲爲TINYBLOB。一旦字符串數組包含多個值,但這顯然會失敗,但只要數組不是太大,它仍然可以正常工作。強制JPA實體字段類型爲BLOB

有什麼辦法強制通過JPA 2(不休眠!)註釋該字段被視爲BLOB而不是TINYBLOB

使用以下將實際創建BLOB類型的安裝過程中柱,但嘗試存儲它仍然沒有實體的實例與

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String" 

字段批註定義時:

@Lob 
@Column(columnDefinition = "blob") 
+0

您應該刪除您'@ Column'註釋或相反,你應該有一個@Column(columnDefinition =「clob」)',因爲你需要[變長字符大對象字符串](http://docs.oracle.com/cd/E35137_01/doc.32/e18460/oracle_db2_compared。 HTM#RPTID114)。 – aribeiro

+0

@aribeiro但我不能 - 那麼我現有的所有條目都被破壞了。 – Marco

+0

那麼怎麼樣創建一個新的字段,用@Column(columnDefinition =「clob」)註釋,從現在起逐漸使用,並將另一個標記爲'@deprecated'?你可以改變你的代碼,這樣所有的更新和新的插入會引用新​​的字段,然後會有一個安全刪除你的「blob」字段的地方。 – aribeiro

回答

0

我認爲你正在寫作方式。爲了避免ClassCastException嘗試添加轉換器並手動將其序列化。添加註釋@Convert(converter = YoursConvertor.class)並實現轉換器類,像這樣:

public class YoursConvertor implements AttributeConverter<String[], String> { 

    @Override 
    public String convertToDatabaseColumn(String[] meta) { 
     String concatString = ""; 
     //... some concatinantion etc 
     return concatString; 
    } 

    @Override 
    public String[] convertToEntityAttribute(String dbData) { 
     String[] result = null; 
     if (dbData != null && dbData.length() > 0) { 
      //... unconcat 
     } 
     return result; 
    } 
} 

也許它必須爲String [],字節[] - 你應該嘗試