gpt4 book ai didi

JPA,模式或反模式 : to have both flat and related sets of mappings?

转载 作者:行者123 更新时间:2023-12-04 06:20:55 26 4
gpt4 key购买 nike

这个问题涉及使用 JPA 来管理一些数据,其中一些场景受益于完整的对象模型,而其他场景似乎可以通过更扁平的模型更好地实现。因此,我倾向于创建两个模型。我觉得这不是一个好主意,但我很难确切地知道原因,或者可能的替代方案。

基本场景是有一个实体,我们称它为 A,它是与实体 B 关系的多方面。所以在数据库 A 中有一个外键字段,如果我们看到的完整对象模型(简化,删除了 getter/setter )

   public Class A {
public int aKey;
public B;
// more attributes
}

public Class B {
public int bKey;
public List<A> collectionOfA;
// and more
}

一种特殊情况是处理新 As 进入系统。它们以文本文件的形式来自一些外部。插入代码需要
   for each CVS record
get the bKey from the record
find the B, or manage any error
create the A, setting the B
persist

现在实际上我的场景更复杂,有几个这样的关系,这样查找/设置配对会重复几次。

或者,我可以(实际上已经)为 A 表创建了第二个映射
  public Class Ainserter {
public int aKey;
public int bKey;
// more attributes
}

现在我只是设置两个值并坚持下去。这确实假设数据库将具有参照完整性约束,但对于我使用的工具,情况就是如此。在这种情况下,以及在许多遗留系统中,DB 预先存在并且可以从新的 JPA 代码和其他甚至非 Java 代码访问。因此,在这种简单的情况下,我认为没有理由将参照完整性检查放在 JPA 代码中。

我可以看到,就我的插入而言,完整模型的各个方面可能有可能变得陈旧,但在遗留环境中,数据库本身随时可能发生插入。所以我在这里没有看到新的问题。

如果两个模型都使用相同的实体上下文,我也可以看到潜在的混淆,但这可以通过适当的封装来避免。

还有其他想法吗?

编辑:

axtavt 建议使用 EntityManager.getReference(B.class, bkey) 来获取 B 实例。我的理解是,如果我这样做,那么为了正确地符合 JPA 编程模型,我应该设置关系的双方,因此我需要访问“引用”的 B 对象并将我的 A 添加到他的集合中。

再次编辑:

我担心访问 B 会导致数据库查找,因此在性能方面我不会获胜。我有很好的权威,至少 OpenJPA,如果我们只访问 B 的 key 和 As 的集合,实际上不需要“膨胀” B - 所以 getReference() 是一个很好的建议。我认为设计良好的 JPA 实现会有这样的优化似乎是合理的。

最佳答案

JPA 有一个 EntityManager.getReference()方法,它基本上结合了您描述的方法。

它获取主键并返回具有该主键的代理对象,而无需访问数据库。因此,您可以使用该对象来初始化关系字段,这与您在第二种方法中想要做的完全一样。

关于JPA,模式或反模式 : to have both flat and related sets of mappings?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com