首页 > 解决方案 > 使用 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 上删除可插入和可更新的限定符,或者将它们添加到不同的真假组合中,甚至混合可空值,但是当尝试这样做时会出现如下错误:

  1. Mixing nullable and non nullable columns in a property is not allowed(这似乎是我需要的)

  2. Mixing updatable and non updatable columns in a property is not allowed

  3. Mixing insertable and non insertable columns in a property is not allowed

  4. 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 引用似乎没有什么不同。

这个问题与另一个问题有些相似,几乎完全一样但是这两个问题似乎都没有询问与主键重叠的可空复合外键的情况,并且提议的解决方案似乎也不适用于这种情况。

标签: javasql-serverpostgresqlhibernatehibernate-mapping

解决方案


推荐阅读