我想在2个实体之间有一个JoinTable,这两个实体派生自同一个所有者实体。因此,当使用@ManyToMany关系加入这些实体时,我得到了@JoinTable(如下面的DDL所示):
CREATE TABLE IF NOT EXISTS `local_services`.`service_provided_on` (
`provider_id` INT UNSIGNED NOT NULL,
`service_id` INT UNSIGNED NOT NULL,
`service_point_no` INT UNSIGNED NOT NULL,
`work_station_no` INT UNSIGNED NOT NULL,
PRIMARY KEY (`provider_id`, `service_id`, `service_point_no`, `work_station_no`),
INDEX `fk_provider_service_has_work_station_work_station1_idx` (`service_point_no` ASC, `work_station_no` ASC, `provider_id` ASC),
INDEX `fk_provider_service_has_work_station_provider_service1_idx` (`provider_id` ASC, `service_id` ASC),
CONSTRAINT `fk_service_provided_on_provider_service`
FOREIGN KEY (`provider_id` , `service_id`)
REFERENCES `local_services`.`provider_service` (`provider_id` , `service_id`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_service_provided_work_station`
FOREIGN KEY (`service_point_no` , `work_station_no` , `provider_id`)
REFERENCES `local_services`.`work_station` (`service_point_no` , `work_station_no` , `provider_id`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
正如您所看到的,有两个外键,每个外键都使用相同的provider_id列。我想定义使用@JoinTable,由给定的Provider提供的属于WorkPlace(WorkStation)的服务。很明显,提供商提供的服务有id ex。 5只能在属于id为5的提供者的工作场所提供。所以最好的方法是在每个ForeignKeys之间共享这个@JoinColumn。当尝试插入不匹配提供者ID的工作区/服务时,会引发一些异常!
我尝试做这样的事情:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "service_provided_on",
joinColumns = {
@JoinColumn(name = "provider_id", referencedColumnName = "provider_id", nullable = false, columnDefinition = "BIGINT UNSIGNED"),
@JoinColumn(name = "service_id", referencedColumnName = "service_id", nullable = false, columnDefinition = "INT UNSIGNED")
},
inverseJoinColumns = {
@JoinColumn(name = "provider_id", referencedColumnName = "provider_id", insertable = false, updatable = false),
@JoinColumn(name = "service_point_no", referencedColumnName = "service_point_no", nullable = false, columnDefinition = "INT UNSIGNED"),
@JoinColumn(name = "work_station_no", referencedColumnName = "work_station_no", nullable = false, columnDefinition = "INT UNSIGNED")
}
)
但它显然不起作用并引发这样的异常:
Caused by: org.hibernate.MappingException: Repeated column in mapping for collection: pl.salonea.entities.WorkStation.providedServices column: provider_id"}}
我考虑将此provider_id ex重命名为一个外键。 work_station_provider_id然后我将被允许插入不匹配的provider_ids,也许我可以定义一些CONSTRAINT来阻止这种行为(如何在JPA中定义它?)。它可以工作,但我将使用相同的provider_id
的冗余列答案 0 :(得分:0)
在某些方面,以这种方式映射模型并没有多大意义。您的多对多关系中没有任何内容可以保证关系中的Service
和Location
必须具有相同的Provider
。我会更改您的对象模型以使该要求显式化。在Provider
和新对象ServiceProvidedOn
之间添加一对多关系(不是最大的名称;也许类似于ServiceOccurrence
?)。因此Provider
会有一个集合属性serviceProvidedOns
;新课程ServiceProvidedOn
将有三个属性provider
,service
和workStation
(适当地映射)。 ServiceProvidedOn
的主键将来自其他三个对象(Provider
,Service
和WorkStation
)。
[我对你的模型做了一些假设;所以我希望这个建议有意义。]