java - 弹簧多对多复合键
问题描述
我创建了以下模型:
“供应商”“PickupStation”
并且它们都与复合键“PickupStationVendorDetails”具有 OneToMany 关系,该复合键具有嵌入式 Id“PickupStationVendorKey”
它可以使用相应的供应商和 PickupStation 保存“PickupStationVendorDetails”,但是当我想从供应商那里获取它们时,什么也找不到。
供应商.java
@Entity
public class Vendor {
...
@OneToMany(mappedBy = "vendor")
private Set<PickupStationVendorDetails> pickupStations;
}
PickupStation.java
@Entity
public class PickupStation {
@OneToMany(mappedBy = "pickupStation")
private Set<PickupStationVendorDetails> vendors;
}
PickupStationVendorDetails.java
@Entity
public class PickupStationVendorDetails {
@EmbeddedId
private PickupStationVendorKey id;
@ManyToOne
@MapsId("vendorId")
@JoinColumn(name = "vendor_id")
private Vendor vendor;
@ManyToOne
@MapsId("pickupStationId")
@JoinColumn(name = "pickup_station_id")
private PickupStation pickupStation;
}
PickupStationVendorKey.java
@Embeddable
public class PickupStationVendorKey implements Serializable {
@Column(name = "vendor_id", columnDefinition = "BINARY(16)")
private UUID vendorId;
@Column(name = "pickup_station_id")
private Long pickupStationId;
public PickupStationVendorKey() {
}
public PickupStationVendorKey(UUID vendorId, Long pickupStationId) {
this.vendorId = vendorId;
this.pickupStationId = pickupStationId;
}
....
}
我如何坚持实体:
首先,我创建了 embeddedID 并通过存储库保存了详细信息:
PickupStationVendorDetails pickupStationVendorDetails = new PickupStationVendorDetails();
pickupStationVendorDetails.setVendor(vendor);
pickupStationVendorDetails.setPickupStation(pickupStation);
pickupStationVendorDetails.setDeliveryDays(relationship.getDeliveryDays());
PickupStationVendorKey embeddedId = new PickupStationVendorKey(vendor.getId(),pickupStation.getId());
pickupStationVendorDetails.setId(embeddedId);
PickupStationVendorDetails d = pickupStationVendorDetailsRepository.save(pickupStationVendorDetails);
之后我将它们添加到相应实体的 Set<> 中并保存它们。
vendor.getPickupStations().add(d);
pickupStation.getVendors().add(d);
vendorService.save(vendor);
pickupStationRepository.save(pickupStation);
当我尝试打电话时vendor.getPickupStations()
,似乎没有任何关系。除非我称pickupStationVendorDetailsRepository.findAll()
复合密钥已正确持久化和保存,从那里我将能够获得 PickupStation 和供应商。但我猜这不是它应该如何工作的。
我错过了什么吗?
解决方案
推荐阅读
- android - RuntimeException:getParameters 失败(空参数)
- c# - 使用 CsvHelper 库,如何将空字段读取为 null 而不是空字符串?
- swift - 每当添加文档时更新视图 - Swift - Firebase Firestore
- java - 与 JAXB 在创建 XML 方面相比,Jackson 的性能如何?
- html - 增加两个部分之间的距离
- flutter - 如何从 Dart 中删除 if-else 链?
- java - Java gradle 项目调试器未显示变量信息
- java - Bean 验证 javax.validation 给出 javax.persistence.spi::No valid provider found。日志消息
- android - 如何使用 Paging3 库在 recyclerview 内的每个 n 位置添加分隔符?
- kotlin - Kotlin to Java,反编译的Java文件很大,为什么?