不知道如何正确地命名标题,但这是问题所在。
假设我有一个类Person
和一个类Organization
,它们的关联类型是“多对一”。在Java代码中,Person
对象具有对Organization
对象的引用,而Organization
具有Collection
个对象中的Person
个。 Person
和Organization
对象都是Serializable
。除此之外,我还对Person
进行了编程,以使其与Organization
并置在一起。
如果将Person
对象的实例放入缓存(网格节点),我只想序列化关联的Organization
的标识符,而不序列化整个被引用的对象。
是否有任何开箱即用的解决方案(某种代理)可以跳过关联对象的序列化,并通过标识符在Person
的反序列化实例上延迟加载关联对象?
我已经看到了基于装饰器的针对Oracle Coherence网格的自定义解决方案,但是实现非常复杂。
答案 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()
将使用保存的值。