【问题标题】:Apache Ignite : Lazy ReferencesApache Ignite:惰性引用
【发布时间】:2019-05-03 07:46:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java data-modeling ignite


    【解决方案1】:

    如何存储组织的 ID 而不是整个 Organization 对象?这是将人员与其组织搭配的正确方式。

    如果您需要在Person 实例中存储一个实际的Organization 对象,您可以创建一个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 会。对于 Person 对象,Organization 只会从缓存中请求一次。对getOrganization() 的后续调用将使用保存的值。

    【讨论】:

    • 感谢您的回答。我希望得到其他意见/选择,只是忘了谢谢你。您显示的代码实现了我在问题中提到的相同概念,但将逻辑委托给 DAO 层,而不是引入代理对象。不幸的是,这不是我的选择。我正在尝试与使用交叉引用进行计算、大量交叉引用(和循环引用)的遗留代码集成。执行计算的代码是我无法控制的。所以我只能扩展现有的类。因此代理是唯一的选择。
    猜你喜欢
    • 2015-11-06
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2022-07-23
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多