gpt4 book ai didi

java - JPA/hibernate : How to associate composite foreign keys with partial primary keys

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:03:43 25 4
gpt4 key购买 nike

我有两个表,每个表都有一个组合键:

CREATE TABLE Software (
id int not null,
version int not null,
PRIMARY KEY (id, version)
);

CREATE TABLE System (
name char(10) not null,
version int not null,
PRIMARY KEY (name, version)
);

现在,我需要一个可以表达“软件对其可以运行的系统版本有最低要求”概念的关联。下表在数据库级别执行此操作:

CREATE TABLE Requirement (
software_id int not null,
software_version int not null,
system_name char(10) not null,
system_version int not null,
PRIMARY KEY (software_id, software_version, system_name),
FOREIGN KEY (software_id, software_version) REFERENCES Software (id,version),
FOREIGN KEY (system_name, system_version) REFERENCES System (name,version)
)

请注意,Requirement 具有三个字段作为主键。如果我将所有四个设为主要,那么我可以表达对软件的多个需求(即 OpenLib v1.2 依赖于 Ubuntu 13.04 和 Ubuntu 13.10),而软件只能对给定的操作系统有一个需求(在例如,OpenLib v1.2 依赖于 Ubuntu 13.04)。

如何将其映射到 JPA/Hibernate @Entity 对象(使用注释)? (包括相关的 OneToMany/ManyToOne 关联。)

我面临的主要问题是只有部分系统 key 用作需求中的主键。

注意:我不必遵守特定的遗留数据库,因此可以修改数据库设计。我也对 @EmbeddedId 和/或 @IdClass 解决方案持开放态度。不过,我更愿意遵守 JPA。

在我的代码中,属性需要通过 getter/setter 进行映射,而不是直接通过字段进行映射,但我想只要转换是直接的,仅使用字段的解决方案就可以了。

谢谢。

** 编辑 28/8/2014 **

考虑以下我用来测试给定解决方案的简单测试场景:

Software software = new Software(1,10);
System system = new System(2,20);
session.save(software);
session.save(system);
Requirement req = new Requirement();
req.setSoftware(software);
req.setSystem(system);
session.save(req);

最佳答案

您可以按如下方式编写Requirement 类:

@Entity
public class Requirement {

@EmbeddedId
private RequirementKey id;

@ManyToOne
@JoinColumns({
@JoinColumn(name = "name", referencedColumnName = "name",
insertable = false, updatable = false),
@JoinColumn(name = "system_version",
referencedColumnName = "version",
insertable = false, updatable = false)
})
private System system;

@ManyToOne
@JoinColumns({
@JoinColumn(name = "id", referencedColumnName = "id",
insertable = false, updatable = false),
@JoinColumn(name = "version",
referencedColumnName = "version",
insertable = false, updatable = false)
})
private Software software;

}

使用RequirementKey:

@Embeddable
public class RequirementKey implements Serializable {
int id;
int version;
String name;
}

我认为有更好的解决方案,但我不知道该怎么做。

关于java - JPA/hibernate : How to associate composite foreign keys with partial primary keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24917105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com