2016-02-09 2 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 ")', который используется постепенно с этого момента, а другой - как «@ Устаревший»? Вы можете изменить свой код, чтобы все обновления и новые вставки ссылались на новое поле, и тогда наступит точка, где можно безопасно удалить поле 'blob'. – aribeiro

ответ

0

I думайте, что вы написали. Чтобы исключить ClassCastException, попробуйте добавить конверты calss и сериализовать их вручную. Добавить аннотацию @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 [], байты [] - вы должны попробовать

Смежные вопросы