Apache Ignite: Ленивые Ссылки - PullRequest
       4

Apache Ignite: Ленивые Ссылки

0 голосов
/ 01 декабря 2018

Не знаю, как правильно сформулировать заголовок, но здесь проблема.Допустим, у меня есть класс Person и класс Organization, а их тип связи - «Многие к одному».В Java-коде Person объект имеет ссылку на Organization объект, а Organization имеет Collection из Person объектов.Оба объекта Person и Organization имеют значение Serializable.В дополнение к этому я запрограммировал Person таким образом, чтобы он был связан с Organization.Если я помещу экземпляр объекта Person в кеш (узел сетки), я бы хотел сериализовать только идентификатор связанного Organization, но не весь объект, на который ссылается.Есть ли какое-либо решение из коробки (какой-то прокси), которое пропустит сериализацию связанного объекта и будет лениво загружать связанный объект по идентификатору в десериализованном экземпляре Person?Я уже видел пользовательское решение для сетки Oracle Coherence, основанное на декораторах, но реализация чрезвычайно сложна.

1 Ответ

0 голосов
/ 01 декабря 2018

Как насчет хранения идентификатора организации вместо целого 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;
}

Таким образом, поле org не будет сериализовано, если Person помещено в кэш Ignite.Только orgId будет.И Organization будет запрашиваться из кэша только один раз для объекта Person.Последующие вызовы getOrganization() будут использовать сохраненное значение.

...