2015-09-29 3 views
3

Я использую Spring Data для сохранения POJO в качестве документов в MongoDB через MongoRepository. Похоже, что Spring автоматически сохраняет оба поля и геттеры в MongoDB.Как отключить отображение полей для данных Spring Data MongoDB?

В общем, я бы хотел, чтобы он сохранялся только в геттерах и никогда не сохранял поля. Я знаю о @Transient для одноразовых аннотаций, но хотел бы настроить это как общее поведение.

Есть ли способ настроить это?

+0

Вы пробовали аннотировать геттер как переходный и сделать поле частным? Это должно работать (как бы оно не противоречиво), если оно реализовано по аналогии с JPA. –

+0

Вообще говоря, все мои поля являются частными, и все они остаются настойчивыми. Я могу пометить собственные поля как @Transient, и это предотвращает его сохранение. Тем не менее, POJO, которые я переношу в MongoDB, как правило, должны только сохраняться из своих геттеров, а частное поле не предназначено для сохранения. Хуже того, я периодически получаю полевые столкновения, когда один класс наследует другой, а частное поле имеет то же имя, что и публичный getter в суперклассе. – DanJ

+0

Вот почему я заявил, что аннотирование геттера вместо частного поля может помочь ... Или я тут что-то не так ... –

ответ

0

Это можно сделать, написав собственные преобразователи.

Вы указываете в своем вопросе, что данные весны mongodb сохраняются и, поля и геттеры. К моему знанию только поля сохраняются. (См 11.1 в доку: http://docs.spring.io/spring-data/mongodb/docs/1.6.3.RELEASE/reference/html/#mapping-conventions (1.6.3 это версия погружено весна-ботинке 1.2.6, но это то же самое в более старых версиях и 1.8.0))

или короткий пример:

Если у вас есть Pojo вроде этого:

@Document 
public class MyClass 
{ 
    private ObjectId id; 

    private String foo = "foo"; 

    public String getBar() 
    { 
     return "bar"; 
    } 
} 

и Repository, как это:

public interface MyClassRepository extends MongoRepository<MyClass,ObjectId> 
{ 
} 

и код приложения, как это:

public static void main(String[] args) throws UnknownHostException 
{ 
    ApplicationContext ctx = SpringApplication.run(NewClass.class, args); 
    MongoTemplate mongoTemplate = ctx.getBean(MongoTemplate.class); 
    MyClass myClass = new MyClass(); 
    mongoTemplate.save(myClass); 
    MyClassRepository myClassRepository = ctx.getBean(MyClassRepository.class); 
    myClassRepository.save(myClass); 
} 

следующий документ сохранить (один раз в шаблоне, а затем снова в хранилище:

{ 
    "_id" : ObjectId("560b97edcb60110890ab7119"), 
    "_class" : "sandbox.MyClass", 
    "foo" : "foo" 
} 

Таким образом, поглотитель не используется для преобразования объекта MyClass.

В той же документации, что и выше, показано, как написать собственный конвертер и как зарегистрировать его на MongoTemplate (раздел 8.10). Здесь вы можете написать код, который использует объявленные геттеры вашего класса и сопоставляет их с полями вашего документа.

+0

А, ты прямо. В Hibernate мы всегда используем режим «только свойства» и отключаем полевые аксессоры. Поэтому я думал об этом назад в отношении данных Spring, который был источником моей путаницы. Интересно ... ОК спасибо за помощь! – DanJ

Смежные вопросы