反序列化外键

问题描述:

我有一个多对一的关系:A * < - >图1B和欲反序列化从具有的主键(一个JSON甲存在于分贝与该主键):反序列化外键

{ 
    "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<>(); 
} 

但对象b = null创建。我如何反序列化Ab属性正确实例化从数据库?

注意:我正在使用杰克逊版本2.6.1。

+0

你想从B信息在哪里?在数据库中查看和创建自定义对象,或者只是创建与id字段空? – varren

您有几种选择,这里是similar question

  1. @JsonCreatorB类(More info

  2. 自定义解串器

  3. 定制ObjectIdResolver@JsonIdentityInfo

    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有些系列化的想法

+0

嗨@varren,谢谢你的非常有趣的答案。我有一个关于它的问题:我如何将对象库传递给ObjectIdResolver? –

+0

有很多选项可供考虑。 1)注入ObjectIdResolver创建ObjectMapper而不是注解[像这样](https://gist.github.com/ftagsold/38a92cba5467fe74ae6b)2)使用一些静态引用到你的版本库/服务/某些版本库工厂3)可能只是autowire它[像这里](https://github.com/terrestris/shogun2/blob/master/src/shogun2-core/src/main/java/de/terrestris/shogun2/converter/PersistentObjectIdResolver.java#L35- L41)更多信息[这里](https://github.com/terrestris/shogun2/search?utf8=%E2%9C%93&q=PersistentObjectIdResolver&type=) – varren

+0

@ y.luis ppl说你可以使用'SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this );'类似于https://*.com/a/21562939/1032167我其实从来没有太多缺乏它。大概可以尝试像https://gist.github.com/varren/c84da2f357a1d86b24bf137f3144cc3a#file-myobjectidresolverautowired-java – varren