gpt4 book ai didi

java - 使用外键从 JSON 反序列化

转载 作者:行者123 更新时间:2023-11-30 06:28:18 25 4
gpt4 key购买 nike

我有一个多对一的关系: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创建的。如何使用从数据库正确实例化的 b 属性反序列化 A

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

最佳答案

您有多种选择,这里是similar question :

  1. B 类中的@JsonCreator 工厂 ( More info )

  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 demo更广泛github project一些序列化的想法

关于java - 使用外键从 JSON 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46650940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com