Apache Ignite:懒惰参考

时间:2018-12-01 09:59:08

标签: java data-modeling ignite

不知道如何正确地命名标题,但这是问题所在。

假设我有一个类Person和一个类Organization,它们的关联类型是“多对一”。在Java代码中,Person对象具有对Organization对象的引用,而Organization具有Collection个对象中的Person个。 PersonOrganization对象都是Serializable。除此之外,我还对Person进行了编程,以使其与Organization并置在一起。

如果将Person对象的实例放入缓存(网格节点),我只想序列化关联的Organization的标识符,而不序列化整个被引用的对象。
是否有任何开箱即用的解决方案(某种代理)可以跳过关联对象的序列化,并通过标识符在Person的反序列化实例上延迟加载关联对象?

我已经看到了基于装饰器的针对Oracle Coherence网格的自定义解决方案,但是实现非常复杂。

1 个答案:

答案 0 :(得分:1)

如何存储组织的ID而不是整个Organization对象?这是使人们与组织配合的正确方法。

如果您需要在Organization实例中存储实际的Person对象,则可以创建一个transient字段并在访问它时进行延迟更新。像这样:

class Person {
    @AffinityKeyMapped
    private int orgId;

    private transient Organization org;

    // Other fields, constructors, getter, setters.
}

// ...

// Accessor method in DAO logic.
Organization getOrganization(Person person, IgniteCache<Integer, Organization> orgCache) {
    Organization org = person.getOrganization();
    if (org == null) {
        org = orgCache.get(person.getOrganizationId());
        person.setOrganization(org);
    }

    return org;
}

当将Person放入Ignite缓存中时,这种方式不会将org字段序列化。只有orgId是。并且Organization对象仅从缓存中请求一次Person。随后调用getOrganization()将使用保存的值。