2017-01-31 6 views
1

Ich versuche, eine LinkedHashMap in einem Blob-Feld meiner Datenbank zu erhalten.Persist LinkedHashMap in Blob

sieht mein Unternehmen als

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

Mein Repository sieht wie folgt aus

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

Beim Versuch, mein Event-Objekt speichern ich die folgende Fehlermeldung

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

Irgendwelche Hinweise erhalten über was ist los?

Antwort

0

Sie müssen sich mehr Anmerkung zum Mapping hinzu:

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

Dies ist die benötigte Setup, in dem die Karte als Map<Basic, Basic> definiert ist

1

BLOB zum Speichern von binären Daten verwendet wird, werden BLOB Werte behandelt als binäre Zeichenfolgen (Bytefolgen). Sie haben keinen Zeichensatz, und Sortierung und Vergleich basieren auf den numerischen Werten der Bytes in Spaltenwerten.

Ich schlage vor, dass Sie stattdessen TEXT verwenden. Und auch Sie müssen JPA @EntityListeners or Callbacks Methods @PrePersist: and @PostLoad Ihren Code

@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); 
    } 

} 
verwenden