簡體   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