【发布时间】:2021-11-11 03:16:56
【问题描述】:
我有一些实体:
@Entity
@Table(name = "cbonus")
public class BonusEntity {
@EmbeddedId
@AttributeOverride(name = "id", column = @Column(name = "id"))
@AttributeOverride(name = "clusterId", column = @Column(name = "cluster_id"))
private BonusId bonusId;
private boolean released;
@ManyToOne(targetEntity = AccountEntity.class, optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "cluster_id", referencedColumnName = "cluster_id", insertable = false, updatable = false)
@JoinColumn(name = "bank_id", referencedColumnName = "bank_id", insertable = false, updatable = false)
@JoinColumn(name = "user_id", referencedColumnName = "user_id", insertable = false, updatable = false)
private AccountEntity account;
}
@Entity
@Table(name = "account")
public class AccountEntity {
@EmbeddedId
@AttributeOverride(name = "clusterId", column = @Column(name = "cluster_id"))
@AttributeOverride(name = "bankId", column = @Column(name = "bank_id"))
@AttributeOverride(name = "userId", column = @Column(name = "user_id"))
@NotNull
private AccountId accountId;
// other fields
}
当我尝试保存新的 cbonus 记录时出现异常:
org.postgresql.util.PSQLException: ERROR: null value in column 关系“cbonus”的“bank_id”违反非空约束详细信息: 失败的行包含 (773, gp3, null, null, f)。
查询
调试 24817 --- [nio-8080-exec-4] org.hibernate.SQL
: 插入 cbonus (released, cluster_id, id) 值 (?, ?, ?)
就在保存之前,对象的所有字段都已填充。 我试图删除空值约束,但随后这些值保持为 NULL。我认为原因是复合主键和复合外键重叠。
我如何使用 Hibernate 来管理这个?
数据库架构:
CREATE TABLE cbonus
(
id BIGINT NOT NULL,
cluster_id TEXT NOT NULL,
bank_id BIGINT NOT NULL,
user_id TEXT NOT NULL,
released BOOLEAN DEFAULT FALSE NOT NULL,
FOREIGN KEY (cluster_id, bank_id, user_id) REFERENCES account,
PRIMARY KEY (id, cluster_id)
);
CREATE TABLE account
(
cluster_id TEXT NOT NULL,
bank_id BIGINT NOT NULL,
user_id TEXT NOT NULL,
-- [other fields]
PRIMARY KEY (cluster_id, bank_id, user_id)
);
【问题讨论】:
标签: hibernate spring-data-jpa composite-primary-key