Решение для весенних данных без аннотаций

Похоже, что в наши дни все используют аннотации для сохранения данных.

Почему это проблема?
Аннотации для сохранения зависят от выбранного API сохранения. Если вы используете MySQL, вы используете @Entity, если вы используете Couchbase, вы должны использовать @Document.

В более крупных проектах обычно есть уровень API, на котором моделируются объекты. Этот уровень имеет или, по крайней мере, не должен иметь каких-либо зависимостей от какой-либо конкретной базы данных.

public class User implements IUser {
    private String email;
    private String id;
    private String password;
    private String username;

Поэтому здесь нельзя использовать @Document.

Уровень базы данных/постоянства в настоящее время имеет только этот репозиторий spring-data

public interface IUserRepository extends CrudRepository<IUser, String> {}

и класс конфигурации

@Configuration
@EnableCouchbaseRepositories
class CouchbaseConfiguration extends AbstractCouchbaseConfiguration {

Я ожидал найти пример базовой конфигурации XML, но ничего, сплошные аннотации.
Как решить эту проблему?
Существует ли подход на основе XML для сопоставления объектов?
Если нет, то как это сделать? решить, не загрязняя уровень API?


person Nabor    schedule 05.12.2016    source источник
comment
это больше похоже на общий вопрос spring-data, поскольку проблема будет такой же с другими реализациями магазина, такими как spring-data-jpa, верно?   -  person Simon Baslé    schedule 06.12.2016
comment
Да, эта проблема затрагивает и другие реализации. Если, например, можно использовать Hibernate, для баз данных SQL моделирование может быть выполнено с помощью xml и без аннотаций на уровне API...   -  person Nabor    schedule 07.12.2016


Ответы (1)


Для этого не существует подхода на основе XML. Если вам нужно, чтобы ваш слой API был полностью чистым, вам все равно нужно использовать конкретное резервное хранилище и в какой-то момент выбрать технологию... Таким образом, это будет означать, что вам нужно добавить слой между API DTO и тем, что Spring Data сохраняется. (сущности).

Обратите внимание, что Spring Data применяет разные соглашения к модели данных в зависимости от хранилища. Для Couchbase аннотация @Document не требуется, если вы не хотите иметь дело с сроком действия/TTL. Тем не менее, аннотация @Id по-прежнему является обязательной (либо из SDK, либо из Spring Data Commons, что я бы рекомендовал в вашем случае)...

Обратите также внимание, что аннотации являются объявлениями. Они не инициируют никаких действий, если хранилище данных не используется для аннотированного типа.

Spring Data Mongo, по-видимому, работает без каких-либо аннотаций, если вы следуете всем соглашениям (в частности, поле id имеет имя id или _id в сущности POJO), поэтому, возможно, Spring Data Couchbase можно изменить по умолчанию на такое соглашение для идентификатора, если аннотация id не найдена? (хороший PR-потенциал там ;-)

person Simon Baslé    schedule 06.12.2016
comment
Опять же, я согласен, аннотации являются просто декларативными, но они добавляют зависимости, которые в какой-то момент могут быть нежелательными. Вскоре вы столкнетесь с ситуацией, когда у вас есть аннотации для сохраняемости вместе с аннотациями для JSON и т. д. Я не думаю, что вам нужен дополнительный слой между API и сохраняемостью, если вы можете настроить сопоставление с аннотациями XML или миксинами или хорошими значениями по умолчанию, как предложенный вами. Все это можно было бы сделать на уровне персистентности... - person Nabor; 07.12.2016