繁体   English   中英

使用外键从 JSON 反序列化

[英]Deserializing from JSON using foreign key

我有一个多对一的关系: A *<-->1 B并且我想从具有B的主键的 JSON 反序列化AB存在于具有该主键的数据库中):

{
    "b": 1
}

我尝试了以下方法:

@Entity
@Table(name = "table_a")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class A implements Serializable {

    @JsonIgnore
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "b", unique = true, nullable = false)
    private B b;
}

@Entity
@Table(name = "table_b")
public class B implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @OneToMany(mappedBy = "b")
    private List<A> a = new ArrayList<>();
}

但是对象A是用b = null创建的。 如何使用从 db 正确实例化的b属性反序列化A

注意:我使用的是 Jackson 2.6.1 版。

您有多种选择,这里有类似的问题

  1. B类中的@JsonCreator工厂(更多信息

  2. 自定义解串器

  3. 用于@JsonIdentityInfo自定义ObjectIdResolver ,例如

    private class MyObjectIdResolver implements ObjectIdResolver { private Map<ObjectIdGenerator.IdKey,Object> _items = new HashMap<>(); @Override public void bindItem(ObjectIdGenerator.IdKey id, Object pojo) { if (!_items.containsKey(id)) _items.put(id, pojo); } @Override public Object resolveId(ObjectIdGenerator.IdKey id) { Object object = _items.get(id); return object == null ? getById(id) : object; } protected Object getById(ObjectIdGenerator.IdKey id){ Object object = null; try { //can resolve object from db here //objectRepository.getById((Integer)idKey.key, idKey.scope) object = id.scope.getConstructor().newInstance(); id.scope.getMethod("setId", int.class).invoke(object, id.key); } catch (Exception e) { e.printStackTrace(); } return object; } @Override public ObjectIdResolver newForDeserialization(Object context) { return new MyObjectIdResolver(); } @Override public boolean canUseFor(ObjectIdResolver resolverType) { return resolverType.getClass() == getClass(); } }

    并像这样使用它:

     @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, resolver = MyObjectIdResolver.class, property = "id", scope = B.class) public class B { // ... }

这是你的案例相关的gist 演示更广泛的github 项目以及一些序列化的想法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM