具有默认值的实例变量的变形投影行为



我不确定这是否是Morphia的设计方式,但现在它开始了。。。

Student.class(方法省略)

@Entity(value = "students", noClassnameStored = true)
public class Student
{
    @Id
    private String id = new ObjectId().toString();
    private String name;
    private String city = "London"; // Default Value
}

注意:我已经为Instance变量city分配了DEFAULT值。现在代码。。。

    Student s1 = new Student("James Bond"); // London IS his default city
    ds.save(s1);
    Student s2 = new Student("Jason Bourne");
    s2.setCity("New York");                 // Set a city for Mr. Bourne
    ds.save(s2);
    System.out.println("----- Normal -----");
    List<Student> studentsNormal = ds.createQuery(Student.class).asList();
    for(Student s: studentsNormal)
        System.out.println(s);
    System.out.println("----- Projected -----");
    Query<Student> query = ds.find(Student.class);
    query.retrievedFields(false, "city");
    List<Student> studentsProjected = query.asList();
    for(Student s: studentsProjected)
        System.out.println(s);

现在输出。。。

----- Normal ----- Student{id='57337553db4f0f0f10a93941', name='James Bond', city='London'} Student{id='57337553db4f0f0f10a93942', name='Jason Bourne', city='New York'} ----- Projected ----- Student{id='57337553db4f0f0f10a93941', name='James Bond', city='London'} Student{id='57337553db4f0f0f10a93942', name='Jason Bourne', city='London'}

现在,4个关于吗啡行为的问题。。。

Q1.对于Bond先生,我没有更改city,并将city从投影列表中排除,但city的默认值打印为London。这不应该是空的吗?

Q2.对于Bourne先生,我确实将city更改为New York,但在投影过程中,它仍然使用默认值并显示London。这不是也应该为空吗?

我还没有看到Morphia的Projection.class(今晚打算这么做),但对于排除,Morphia似乎采用了默认值,并且不会超过null。现在,这成为了一个障碍,因为我无法在不将实例变量暴露给客户端的情况下为其提供默认值。。。

Q3.这是Morphia还是MongoD Java驱动程序的行为/问题?

最后一个问题。。。

Q4.有什么已知的解决方法吗?

我在谷歌上搜索过,但到目前为止还没有找到任何解决方案或解释。。。

提前感谢。。。

SG

当Morphia从查询结果中读取文档时,它所做的第一件事就是创建实体的新实例Student。它只是调用无参数构造函数。这里面没有魔法。city字段是用一个值初始化的。完成后,Morphia将获取从数据库返回的文档中的每个键,找到映射的字段并进行设置。在您的情况下,文档中没有城市键,因此Morphia永远不会设置该字段,只保留初始化值。

通常,像这样初始化实体上的字段是一种糟糕的做法。对于从数据库加载的每个实体,JVM必须将这些字段初始化为某个值,以便稍后覆盖它们。在像您这样的情况下,某些字段没有返回到查询结果中,在Morphia将新实例返回到您的应用程序后,这些值仍然存在。

最新更新