При использовании Spring 5.0.6 и Spring-Data-Mongo 2.0.7 у меня возникает проблема при извлечении сущностей, преобразованных в неправильный класс.См. Следующий упрощенный сценарий:
Настройка сущности:
public class PersistableObject {
@Id @Field("_id") private String id;
}
@Document(collection = "myapp_user")
public class User extends PersistableObject {...}
public class RealUser extends User {...}
public class VirtualUser extends User {...}
Итак, существует общая коллекция MongoDB , в которой хранятся оба типа User
, различаемые автоматическидобавлено свойство _class .
Кроме того, существует репозиторий, в который вставляется шаблон MongoTemplate.
@Autowired
private org.springframework.data.mongodb.core.MongoTemplate template;
Пока все хорошо.Теперь, если я хочу получить все документы, содержащие RealUser
, я мог бы назвать это
template.findAll(RealUser.class)
Я бы ожидал, что шаблон найдет все документы, имеющие свойство дискриминатора _class установите com.myapp.domain.RealUser
.
Но это не работает, как ожидалось.Я даже получаю все VirtualUser
s, а также помещаю их в объекты типа RealUser
, при этом все свойства, относящиеся к VirtualUser, отсутствуют, а все свойства, относящиеся к RealUser, установлены на null
.
Кроме того, когда я иду и сохраняю User
, который на самом деле является VirtualUser
в MongoDB, но был сжат в класс RealUser
, Spring изменит свойство _class
нанеправильный тип, магически , преобразующий VirtualUser
в RealUser
.
Таким образом, оба метода здесь будут загружать всю коллекцию и сжимать все объекты в указанный класс, даже если он неправильный:
template.findAll(VirtualUser.class)
template.findAll(RealUser.class)
Такое поведение, вероятно, нежелательно, или еслизначит, это крайне обманчиво и вредно.Вы можете легко уничтожить все данные с помощью этого.
Может кто-нибудь пролить свет на это?