首页 > 解决方案 > 弹簧多对多复合键

问题描述

我创建了以下模型:

“供应商”“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 和供应商。但我猜这不是它应该如何工作的。

我错过了什么吗?

标签: javaspringjpa

解决方案


推荐阅读