当前位置: 首页 > 知识库问答 >
问题:

JPA:重复简单与关系映射-在哪里放置可插入=假,可更新=假以及为什么

苍元章
2023-03-14

这是Hibernate的后续问题:在涉及外键的复合主键星座中,可插入=假,可更新=假属于哪里?

考虑以下实体映射:

public class Zip {

    @ManyToOne
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code")
    private Country country = null

    @Column(name = "country_code")
    private String countryCode;

    ...
}

像这样,JPA实现会窒息,比如“country_code的重复映射,其中只有一个可以指定为可写的”。

Q:

为什么将关系设为只读(私人国家/地区)在这里/通常比将只读放在简单的ID字段(私人字符串国家/地区)上更受欢迎?

为什么一个在实践中比另一个更好(优点/缺点)?

我唯一能想到的是,当数据库不使用任何fk时,使用可写关系会更好,这将使使用实体变得有些强制性,但是,这不会阻止用户能够使用未知id向数据库中插入新的实体,这只会使可写关系稍微安全一些。当然,能够使用IDs会使从DB加载完整的实体变得多余,这可能是一个很大的性能方面。

欢迎更多的争论。

PS:我添加了JPA实现作为标签来吸引更多的观众。

共有1个答案

陈俊郎
2023-03-14

首先,不需要使用countryCode映射,因为其中的数据保存在引用的国家中,在iso_code的映射中。例如,EclipseLink可以使用<code>zip.country。id=:isoCode在查询中,并且知道它可以直接使用country_code外键,而不必连接表,就像使用zip一样。countryCode=:isoCode。因此,如果两者都有,则应该有一个原因,并且该原因应该指示您希望控制哪一个country_code外键。

其次,如果数据库没有外键约束,那么建立关系对你没有任何帮助。在没有限制的情况下,如果您从数据库中删除国家,您的Zip仍将引用该国家。如果它不在缓存中,则countryCode将有一个值,但引用将为空(或根据提供程序抛出错误)。

我也不同意关系应该是只读的;我相信这样做很可能是为了在数据库中改变关系,而不必读入引用的对象,IMO是一种糟糕的做法。JPA允许两层缓存,因此更改将导致缓存关系与数据库不同步,然后需要额外的开销来解决。如果您打算这样做,那么不妨根本不映射country关系引用-如果需要,请从JPA中读取它,如果有意义,请将其作为临时html" target="_blank">存储在实体中。

最后,您的对象模型应该映射您的业务需求。仅仅因为数据库有引用和字段,并不意味着您的Java实体也必须以完全相同的方式映射它们。

 类似资料:
  • 我有一个简单的POJO(字段1,字段2,字段3),我使用HibernateORM,我有一个基本的需求:我永远不应该更新数据库中的字段3。一旦第一次插入一行,当我调用回购以通过id(findById)获取对象时,即使我调用字段3的setter(setField3()),调用保存方法也应该抛出错误或异常,指定我正在尝试更新字段3,我不应该。我不知道Hibernate是否可以处理这种需求,或者我是否必须

  • 如果我将一个字段定义为不可更新的,这是否意味着该字段根本不能更新?我想做的是在保存整个实体对象时防止字段被更新,但仍然能够编写显式更新该字段的查询。这可能吗? 我使用的是Hibernate和MySQL,但我更喜欢编写可移植代码。

  • 问题内容: 在课堂上,我在玩耍,发现CSS可以与虚构元素一起使用。 例: 当我的教授第一次看到我使用此功能时,他对组合元素起作用感到惊讶,并建议我将所有组合元素更改为带有ID的段落。 为什么我的教授不希望我使用虚构元素?他们有效地工作。 另外,他为什么不知道组成元素存在并且可以与CSS一起使用。他们不常见吗? 问题答案: 为什么CSS可以处理假元素? (大多数)浏览器被设计为(在某种程度上)与将来

  • 在我的课堂上,我四处游荡,发现CSS可以使用虚构的元素。 示例: null null 当我的教授第一次看到我使用这个的时候,他有点惊讶于合成元素的工作,并建议我简单地将所有合成元素改为带有ID的段落。 为什么我的教授不希望我使用虚构的元素?它们有效地工作。 还有,为什么他不知道虚构元素的存在,并与CSS一起工作。他们不常见吗?

  • 问题内容: 为什么返回 Javascript? 在文档页面上,我看到以下内容: ## 针对NaN的测试 相等运算符(和)不能用于测试的值。使用代替。 有没有参考资料可以回答这个问题?不客气。 问题答案: 严格的回答 :因为JS规范是这样说的: 如果Type(x)是Number,则 如果x为NaN,则返回false。 如果y为NaN,则返回false。 有用的答案 :浮点数的IEEE 754规范(所

  • 所以我在网上搜索了我的问题的答案,但没有找到有帮助的东西,基本上是需要在两个类之间有一个ManyToOne关系,其中一个类有一个EmbeddedId,我要把代码留在这里,错误信息是它给(我使用野蝇来运行服务器)。 公共类InventoryPK实现可序列化{ } @实体@Table(name=“inventario”,schema=“mxnextmob”) 公共类库存扩展基本模型{ } 公共类公司扩