我的数据模型由具有历史记录的项目组成。我将一个时间点称为"瞬间";因此,所有表都有一个"instant_id",用于指定该项目当时的配置方式。"instant_id"被滚动到所有表的复合主键中。想象一下以下示例:
Table Computer
============
PK int instant_id <-- Shared id
PK int computer_id <-- Child id
int computer_type_id <-- Parent id
varchar foo
Table ComputerType
==================
PK int instant_id <-- Shared id
PK int computer_type_id <-- Parent id
varchar bar
计算机映射 (instant_id, computer_type_id) 中有一个外键到 ComputerType 主键。
我们使用类似的东西
@Embeddable ComputerId {
@Column(name='instant_id', nullable=false) int instant_id,
@Column(name='computer_id', nullable=false) int computer_id
}
然后:
Computer {
@EmbeddedId ComputerId id;
@MapsId('instant_id')
@ManyToOne
@JoinColumns({
@JoinColumn(name='instant_id',...),
@JoinColumn(name='computer_type_id',...)
})
ComputerType computerType;
}
无论我如何将MapsId与JoinColumns结合起来,我似乎都无法让它工作。有什么想法吗?
我没有看到ManyToOne关联。您没有向我们展示如何声明ComputerType,我假设它是一个实体。如果是这种情况,根据您提供的表定义,计算机和计算机类型共享一个复合主键:instant_id 和 computer_type_id。
如果这是真的,并且它们共享相同的主键,则最好将这两个表规范化为一个表。
我想我现在明白这个问题了。您还需要将computer_type_id视为计算机表的复合键的一部分。computer_type_id列本身并不十分有意义;在 ComputerType 表中,它是主键的一部分,另一部分是instant_id。因此,如果是这种情况,您还需要将其作为计算机表的主键的一部分,因为对于给定的相关关联,您永远不会遇到 Computer.instant_id = ComputerType.instant_id AND Computer.computer_type_id <> ComputerType.computer_type_id的情况。(如果我正确理解这种情况)
如果您同意这一点,那么这是解决方案:
@Embeddable
public class ComputerId implements Serializable {
int computer_id;
@ManyToOne
@JoinColumns({@JoinColumn(name = "instant_id", insertable=false, updatable=false),
@JoinColumn(name = "computer_type_id", insertable=false, updatable=false) })
ComputerType computerType;
// getters and setters
}
@Entity
public class Computer {
@EmbeddedId
ComputerId computerId;
// getters and setters
}
public class ComputerTypeId implements Serializable {
@Column(name="instant_id", nullable=false) int instant_id;
@Column(name="computer_type_id", nullable=false) int computer_type_id;
// getters and setters
}
@Entity
public class ComputerType {
@EmbeddedId
ComputerTypeId computerTypeId;
String bar;
// getters and setters
}
最后,您可能需要考虑用于实体版本控制的休眠版本。
希望这有帮助。