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

2024-01-29

我不确定 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
}

注意:我已经分配了一个DEFAULT价值Instance多变的city。 现在代码...

    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.对于邦德先生,我没有改变city并排除city从投影列表中,但默认值city打印为London。这不应该是空的吗?

Q2。对于伯恩先生,我确实改变了city to New York但仍在投影过程中,它选择了默认值并显示London。这不应该也为空吗?

我还没有看到来自 Morphia 的 Projection.class (打算今晚这样做),但似乎对于排除, Morphia 似乎采用了默认值并且不会覆盖null。现在这成为一个障碍,因为我没有任何方法可以为我的实例变量提供默认值而不将它们暴露给客户端......

Q3。这是 Morphea 还是 MongoDB Java 驱动程序行为/问题?

最后一个问题...

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

我已经用谷歌搜索过,但到目前为止还没有找到任何解决方案或解释......

提前致谢...

SG


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有默认值的实例变量的 Morphia 投影行为 的相关文章

随机推荐