Springboot使用ElementCollection和Redis
背景:DB储存集合时偷懒不想使用多表关联,使用了@ElementCollection ,同时对象也在Redis中进行交互,会抛出异常
原因:hibernate自身会把集合对象替换为PersistentXXX,这个对象在存入Redis过程中的序列化/反序列化会出错。
网上给出的解决一般是将此字段在处理为Json时忽略掉,但是有时候这个字段需要存入Redis中使用,为了解决这个问题,尝试了
1. 既然是因为懒加载导致的,那么我关闭掉懒加载,尝试了FetchType.EAGER。(不行)
2. 既然默认的Redis序列化/反序列化不行,那我指定自定义的序列化类,将PersistentXXX处理为util包中的集合类输出。(不行)
3. 新增一个字段2,字段1负责与数据库交互,字段2负责Json相关的交互。(虽然不优雅,但是成功)。本来偷懒的,但是却增加了代码量,示例代码如下所示:省去了部分注解和get set方法
@Entity
public class MyClass{ @Fetch(FetchMode.JOIN) @ElementCollection(targetClass = String.class) @JsonIgnore private Set<String> nameDb; @Transient private Set<String> name; // name 字段的 get set 方法比较特别,这里简略省去了集合为null的判断,自行添加上 // json 序列化,实际从数据库字段nameDb中取值,存入redis中或者接口返回到前端 public Set<String> getName() { this.name.addAll(this.nameDb); return this.name; } // json 反序列化或者前端接口传入值会调用,此时需要写入到数据库字段中 public Set<String> setName(Set<String> set) { this.nameDb.addAll(set); this.name = set; } }