2017-01-31 6 views
1

Я пытаюсь сохранить LinkedHashMap в поле blob моего db.Persist LinkedHashMap в blob

Моя сущность выглядит следующим образом

@Entity 
public class Event { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    private long timestamp; 
    @Lob 
    private Map<String, Object> payload; 
... 

Мой репозиторий выглядит следующим образом

@Repository 
public interface EventRepositoryInterface extends CrudRepository<Event, Long> { 
} 

При попытке сохранить свой объект Event, я получаю следующее сообщение об ошибке

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.sql.Blob 

Любые подсказки о чем не так?

ответ

0

Вам нужно добавить больше аннотации к отображению:

@Lob 
    @MapKeyColumn(name = "key_column") 
    @Column(name = "value_column") 
    @ElementCollection 
    private Map<String, Object> payload; 

Это необходимая установка, где карта определяются как Map<Basic, Basic>

1

BLOB используется для хранения бинарных данных, BLOB значений обрабатываются как двоичные строки (байтовые строки). У них нет набора символов, а сортировка и сравнение основаны на числовых значениях байтов в значениях столбцов.

Я предлагаю вместо этого использовать TEXT. А также вы должны использовать JPA @EntityListeners or Callbacks Methods @PrePersist: and @PostLoad ваш код станет

@Entity 
public class Event { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    private long timestamp; 

    @Column(columnDefinition = "TEXT") 
    private String payload 

    @Transient 
    private Map<String, Object> payloadOb; 

    @PrePersist 
    public payloadMapToText(){ 
     this.payload = mapToString(this.payloadOb); 
    } 

    @PostLoad 
    public payloadTextToMap(){ 
     this.payloadOb = stringToMap(this.payload); 
    } 

}