аннотации динамических объектов Spring-data - PullRequest
0 голосов
/ 07 марта 2019

У меня есть класс сущностей, который будет использоваться в постоянстве данных весны.

@Persistent 
public class Foo{
  Bar bar;
}

Поскольку мы переключаемся между слоями персистентности Couchbase и Aerospike - этот класс будет использоваться в обоих из них в течение некоторого времени,Вот почему у меня есть эти классы в общем модуле Maven.Структура модуля выглядит следующим образом:

  • постоянство-обычное
  • постоянство-аэро
  • постоянство-диван

Моя идея заключается в том, чтобы иметьSpring-data CouchbaseRepository и AerospikeRepository в соответствующих модулях, оба реализуют класс Repository из общего

public interface Repository {
   save(Foo foo);
}

И у меня есть одна проблема.Мне нужно, чтобы у моего Foo.class была опция истечения срока действия, которая могла бы быть достигнута путем добавления либо аннотации @org.springframework.data.aerospike.mapping.Document(expiration = ...) для аэроспайки, либо аннотации @org.springframework.data.couchbase.core.mapping.Document(expiryExpression = ...) для couchbase.И я не хочу, чтобы эти аннотации были в общем модуле.Мне нужно, чтобы они добавлялись в класс Foo динамически, в зависимости от того, какие из модулей (couchbase или aerospike или оба) включены во время выполнения.

Можно ли как-то добиться такой гибкости?

1 Ответ

0 голосов
/ 07 марта 2019

Мои два цента. Используйте interface для вашей базовой модели внутри persistence-common.

public interface Foo {
   Bar getBar();
}

Теперь вы можете реализовать его один раз для persistence-aero модуля

@Document(expiration = 1000)
public class AerospikeFoo implements Foo {
   @Override
   public Bar getBar() { ... }
}

и один раз за persistence-couch

@Document(expiryExpression = "...")
public class CouchbaseFoo implements Foo {
   @Override
   public Bar getBar() { ... }
}

Это прояснит область их использования и цели.
Вам не нужно повторно использовать @Persistent, так как он уже унаследован с @Document.

Если они имеют какую-то функциональность, создайте делегирование class в строке PersistenceFooHelper. Не расширяйте abstract class.

...