[英]Deserializing from JSON using foreign key
我有一個多對一的關系: A *<-->1 B並且我想從具有B的主鍵的 JSON 反序列化A ( B存在於具有該主鍵的數據庫中):
{
"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 版。
您有多種選擇,這里有類似的問題:
B
類中的@JsonCreator
工廠(更多信息)
自定義解串器
用於@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 { // ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.