Я пытаюсь включить кэш L2 в моей установке JDO.
Конфигурация пружины:
<prop key="datanucleus.cache.level2.type">spymemcached</prop>
<prop key="datanucleus.cache.level2.memcached.servers">localhost:11211</prop>
поэтому префикс по умолчанию является "datanucleus".
Проблема в том, что любой объект с SingleFieldIdentity представлен ключом "datanucleus ###", где ### - строковое представление этого идентификатора БЕЗ имени класса в этом ключе.
Образец класса:
@PersistenceCapable(detachable="true", table="sites", cacheable="true")
public class Site
implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
public Long id;
}
У меня есть другие кешируемые классы, например Account. Учетная запись с идентификатором 7 хранится в memecached как «datanucleus7», поэтому, когда сайт с id = 7 извлекается из кэша, все облажается.
В пакете кеша datanucleus есть класс SpymemcachedLevel2Cache (SpymemcachedLevel2Cache.java):
public class SpymemcachedLevel2Cache extends AbstractLevel2Cache
{
...
public CachedPC get(Object oid)
{
return (CachedPC) client.get(cacheName + oid.toString());
}
...
}
Но oid.toString () для SingleFieldIdentity (например, LongIdentity) - это простое число без информации о классе.
Итак, вопрос в том, как я могу изменить это поведение? Должен ли я переопределить SpymemcachedLevel2Cache, используя
if (nucleusCtx.getApiAdapter().isSingleFieldIdentity(id))
{
String targetClassName = nucleusCtx.getApiAdapter().getTargetClassNameForSingleFieldIdentity(id);
...