Hibernate Mapping 映射不适用于中间实体

Hibernate Mapping maps doesn't work with a intermediate entity

我有一个 Hibernate ORM 问题,与中间实体实现的多对多关联。

我的中间实体 PurchaseInvoiceShippingDocument 将多个 PurchaseInvoices 与多个 ShippingDocuments 连接起来;

@Entity
@Table(name = "PURCHASE_INVOICE_SHIPPING_DOCUMENT")
public class PurchaseInvoiceShippingDocument
{
    @Embeddable
    public static class Pk implements Serializable
    {
        @Column(name = "PURCHASE_INVOICE_ID", nullable = false, updatable = false)
        private Long mPurchaseInvoiceId;

        @Column(name = "SHIPPING_DOCUMENT_ID", nullable = false, updatable = false)
        private Long mShippingDocumentId;

        public Pk()
        {
        }

        public Pk(Long pPurchaseInvoiceId, Long pShippingDocumentId)
        {
            setPurchaseInvoiceId(pPurchaseInvoiceId);
            setShippingDocumentId(pShippingDocumentId);
        }

        public Long getPurchaseInvoiceId()
        {
            return mPurchaseInvoiceId;
        }

        public void setPurchaseInvoiceId(Long pPurchaseInvoiceId)
        {
            mPurchaseInvoiceId = pPurchaseInvoiceId;
        }

        public Long getShippingDocumentId()
        {
            return mShippingDocumentId;
        }

        public void setShippingDocumentId(Long pShippingDocumentId)
        {
            mShippingDocumentId = pShippingDocumentId;
        }
    }

    @EmbeddedId
    private Pk mPk;

    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity = PurchaseInvoice.class)
    @JoinColumn(name = "PURCHASE_INVOICE_ID", insertable = false, updatable = false)
    private PurchaseInvoice mPurchaseInvoice;

    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity = ShippingDocument.class)
    @JoinColumn(name = "SHIPPING_DOCUMENT_ID", insertable = false, updatable = false)
    private ShippingDocument mShippingDocument;

在 PurchaseInvoice 和 ShippingDocument 中我可以访问 PurchaseInvoiceShippingDocument;

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "mPurchaseInvoice")
private Set<PurchaseInvoiceShippingDocument> mPurchaseInvoiceShippingDocumentSet = new HashSet<>();

这有效,但是当我想删除 PurchaseInvoiceShippingDocument 时,我必须遍历 Set<PurchaseInvoiceShippingDocument> 并检查每个 ShippingDocument(或另一侧的 PurchaseInvoice)。

因此我想直接访问 ShippingDocument(或另一端的 PurchaseInvoice)。 我可以为此使用地图映射;

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "mPurchaseInvoice")
@MapKey(name = "mShippingDocument")
private Map<ShippingDocument, PurchaseInvoiceShippingDocument> mPurchaseInvoiceShippingDocumentMap = new LinkedHashMap<>();

这会生成,但地图始终为空(当数据库正在填满时)。 来自 IntelliJ 的代码检查器产生警告;

这段代码有什么问题? 为什么找不到 mShippingDocument?

映射确实有效!我的测试用例中有一个错误,每次测试都会创建一个新的 PurchaseInvoice。 事实上,之前的 ShippingDocuments 没有连接到这个新的 PurchaseInvoice(并且地图保持为空)。

问题仍然是为什么 IntelliJ 会产生警告;

Cannot resolve attribute 'mShippingDocument'