在blob中保留LinkedHashMap

时间:2017-01-31 22:45:30

标签: spring hibernate blob

我正在尝试在我的数据库的blob字段中持久保存LinkedHashMap。

我的实体如下所示

@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

关于什么是错的任何线索?

2 个答案:

答案 0 :(得分: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);
    }

}

答案 1 :(得分:0)

您需要为映射添加更多注释:

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

这是必需的设置,其中地图定义为Map<Basic, Basic>