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'
我有一个 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'