java - 使用 Java Hibernate,当复合键的一部分是主键的一部分时,如何使用可为空的复合外键?
问题描述
特别是我们的数据库关系是这样的,标题:
表 S
column id
...other irrelevant columns omitted...
primary key on id only
表 C
column S_id
column id
...
compound primary key on S_id (which is a foreign key to id column in table S) and id.
表一
column S_id
column id
column C_id
...
compound primary key again on S_id and id.
compound foreign key on C_id and S_id, but C_id column in this table is also nullable.
我已尝试对 IObject 上的 java hibernate 注释进行以下操作以用于建模表 I:
@ManyToOne
@JoinColumns({
@JoinColumn({name="C_id", referencedColumnName="id",insertable=false,updateable=false),
@JoinCOlumn({name="S_id", referencedColumnName="S_id", insertable=false,updateable=false)
})
private CObject _cObjectRef;
@EmbeddedId
private EmbeddedIdCompositeKeyObject _primaryKey;
...
这是 CObject 上用于建模表 C 的 java hibernate 注释的重要部分:
@EmbeddedId
private EmbeddedIdCompositeKeyObject _primaryKey;
@MapsId("_s_id")
@ManyToOne(optional=false)
@JoinColumn(name="S_id", nullable = false)
private SObject _sObject;
...
这是 EmbeddedIdCompositeKeyObject 的样子(它的 @Embeddable 并实现了 Serializable):
@Column(name = "id", nullable = false)
private int _id;
@Column(name = "S_id", nullable = false)
private int _s_id;
...
constructors, getters, hashCode, and equals ommitted.
但是,在运行时,尽管 _cObject 被设置为与数据库中存在的内容匹配的现有 CObject 实例,但 hibernate 无法更新表 I 的这些列。在 IObject 上调用 hibernate 的 session.saveOrUpdate 方法时,I 对象表中的所有其他列都会正确保存和更新,但使用此可为空的复合外键的列除外。
我尝试在 JoinColumns 上删除可插入和可更新的限定符,或者将它们添加到不同的真假组合中,甚至混合可空值,但是当尝试这样做时会出现如下错误:
Mixing nullable and non nullable columns in a property is not allowed
(这似乎是我需要的)Mixing updatable and non updatable columns in a property is not allowed
Mixing insertable and non insertable columns in a property is not allowed
Repeated column in mapping for entity: foo.bar.IObject columns S_id (should be mapped with insert="false" update="false"
将 @MapsId("_s_id") 添加到 IObject 的 CObject 引用似乎没有什么不同。
这个问题与另一个问题有些相似,几乎完全一样,但是这两个问题似乎都没有询问与主键重叠的可空复合外键的情况,并且提议的解决方案似乎也不适用于这种情况。
解决方案
推荐阅读
- python - 无法创建与 Jupyter 一起正常工作的环境(Conda 或 pipenv)
- asp.net - 尝试在 asp.net mvc 中使用 foreach 循环添加模式
- azure - 无法将 expo 重定向 Uri 添加到 Azure AD B2C 应用程序
- django-staticfiles - 姜戈;如何从任何位置提供静态文件
- amazon-web-services - 如果集群创建者未知,如何与其他用户访问集群?
- javascript - 使用 Javascript 在同一网页(大图像下方)上动态创建生成图像的缩略图
- java - PKIX 路径验证失败:java.security.cert.CertPathValidatorException:名称约束检查失败
- python - 用于 python 的 ISO 4217 表
- python - 在python的同一行内分配多个变量
- java - sql 错误或缺少数据库(未找到此类表)(来自 Java 的 SQlite 数据库连接)