Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从数据库创建对象后是否初始化临时字段?_Java_Database_Mongodb_Serialization_Morphia - Fatal编程技术网

Java 从数据库创建对象后是否初始化临时字段?

Java 从数据库创建对象后是否初始化临时字段?,java,database,mongodb,serialization,morphia,Java,Database,Mongodb,Serialization,Morphia,我正在使用Morphia和MongoDB。获取数据时,使用默认构造函数(不带参数)创建对象,然后使用反射初始化字段(Kryo和Jackson等序列化库也会这样做)。这样就不可能根据构造函数中字段的值来添加代码(因为它们还没有用数据库中的数据初始化)。我想知道是否有一种方法可以在获取和创建对象之后运行额外的代码,而不必在之后手动调用方法?原因是我正在存储对象的部分数据,并基于它自己的数据和许多引用来初始化额外的瞬态字段。我目前可以想出4个备选方案: 当对象为空时,运行类似.initialize()

我正在使用Morphia和MongoDB。获取数据时,使用默认构造函数(不带参数)创建对象,然后使用反射初始化字段(Kryo和Jackson等序列化库也会这样做)。这样就不可能根据构造函数中字段的值来添加代码(因为它们还没有用数据库中的数据初始化)。我想知道是否有一种方法可以在获取和创建对象之后运行额外的代码,而不必在之后手动调用方法?原因是我正在存储对象的部分数据,并基于它自己的数据和许多引用来初始化额外的瞬态字段。我目前可以想出4个备选方案:

  • 当对象为空时,运行类似.initialize()的操作 但每当有人(包括我)忘记运行时 方法问题开始出现
  • 将那些当前临时字段添加到数据库中,但 它们在运行时变化很大,因此需要更新 频繁地因为每个物体都有几十个我不认为 这是一个好方法
  • 删除瞬态字段并添加 返回值。这将为我的服务器添加一些额外的工作,但是 听起来是目前最好的选择
  • 将所有瞬态字段默认为null,每当需要获取或设置其中一个字段时,我都会计算并填充它们,只要它为null

  • 我目前正在使用1。但是我在争论我应该用3还是4。但是,如果有更好的方法在创建对象后运行某些代码,我想知道。

    您可以使用
    @PostLoad
    运行
    initialize()
    并在将数据加载到新实例f

    时,Morphia自动为您调用该方法,使临时字段成为私有字段和getter方法,检查该字段是否已初始化。如果未初始化,则计算该值并将其缓存。这可能是3和4的组合吗?@WangSheng它实际上是4。这意味着我必须使用对象而不是primitive,但这不应该是一个问题。对不起,我认为“添加方法”意味着添加getter和setter。那么这就是第四种选择。我认为使用包装器而不是原语是完全可以的。我能想到的另一个选择是有一个名为
    initialized=false
    的字段和一个
    init
    方法。在每个getter中,检查
    initialized
    ,如果
    false
    调用
    init
    方法。@WangSheng我现在有一个
    initialize
    方法,该方法初始化所有字段,并在每个
    get
    方法为空时调用它。然而,这仍然让人感觉奇怪,因为现在我添加了额外的方法,比如
    changeFieldBy(int-amount)
    ,现在我觉得我必须再次检查null或捕获
    npe
    ,即使我如何使用代码不太可能为null。我想我必须对一个
    初始化的
    布尔值执行同样的操作。所有的选择都让人觉得不安全或不安全。正是我在寻找的,我一定已经在网站上读过了。你能接受这个答案吗,这样其他人就可以更容易地找到它了?谢谢