【问题标题】:Initialize transient fields after object is created from database?从数据库创建对象后初始化瞬态字段?
【发布时间】:2018-08-13 07:20:17
【问题描述】:

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

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

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

【问题讨论】:

  • 将瞬态字段设为私有,并在 getter 方法中检查该字段是否已初始化。如果未初始化,则计算该值并缓存它。这可能是 3 和 4 的组合吗?
  • @WangSheng 实际上是 4。这是否意味着我必须使用对象而不是原始对象,但这应该不是问题。
  • 抱歉,我认为“添加方法”意味着添加 getter 和 setter。那么这是第四个选项。我认为使用包装器而不是原语是完全可以的。我能想到的另一种选择是有一个名为initialized = false 的字段和一个init 方法。在每个吸气剂中,检查initialized,如果false 调用init 方法。
  • @WangSheng 我现在有一个 initialize 方法,它初始化所有字段并在每个 get 方法为空时调用它。但是,这仍然让人感觉很奇怪,因为现在我正在添加其他方法,例如 changeFieldBy(int amount),现在我觉得我必须再次检查 null 或捕获 npe,即使我使用代码的方式不太可能为 null。我想我必须为 initialized 布尔值做同样的事情。所有选项都让人觉得不安全或不安全。

标签: java database mongodb serialization morphia


【解决方案1】:

您可以使用@PostLoad 来运行您的initialize(),当Morphia 将数据加载到新实例f 完成后,它会自动为您调用该方法

【讨论】:

  • 正是我在寻找的内容,我一定在Annotation section 阅读过它。
  • 您能否接受答案,以便其他人更容易找到它?谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-10-02
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 2016-04-03
相关资源
最近更新 更多