【问题标题】:Persist LinkedHashMap in blob在 blob 中持久化 LinkedHashMap
【发布时间】:2017-06-17 13:21:41
【问题描述】:

我正在尝试在我的数据库的 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

有什么线索吗?

【问题讨论】:

    标签: spring hibernate blob


    【解决方案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);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

      这是所需的设置,其中地图定义为Map&lt;Basic, Basic&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2012-12-07
        • 2020-11-29
        • 2012-12-14
        • 2012-10-25
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多