这是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实现作为标签来吸引更多的观众。
首先,不需要使用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”) 公共类库存扩展基本模型{ } 公共类公司扩