我正在使用 JPA 注释,当我有 OneToMany - ManyToOne 关系时,当我在 ManyToOne 中看到我的实体时,joinColumn 始终为空值。
接下来我将展示我的示例,我有产品:
@Entity
@Table(name = "PC_PRODUCT")
public class Product extends LaunchEntity {
private static final long serialVersionUID = 1L;
@XmlElement(name = "Product_Name", required = true)
protected String productName;
@XmlElement(name = "Product_Description")
protected String productDescription;
@XmlElement(name = "Product_To_Charge")
@OneToMany(mappedBy = "product", cascade=CascadeType.MERGE)
protected List<ChargeRelation> productToCharge;
这是我的 ChargeRelation 类:
@Entity
@Table(name="PC_CHARGE_RELATION")
public class ChargeRelation
extends RelationEntity
{
private static final long serialVersionUID = 1L;
@XmlElement(name = "Charge", required = true)
@OneToOne(cascade = CascadeType.MERGE)
protected Charge charge;
@XmlTransient
@ManyToOne(cascade=CascadeType.MERGE)
@JoinColumn(name="PRODUCT_ID")
protected Product product;
我正在读取一个 xml 文件,将数据转换为字符串,为我的根对象进行解码并保留该对象。
问题是,当我在字符串中发现费用关系时,这些值会插入到费用关系表中,但包含product_id的列始终为空。
我已经定义了所有的 setter 和 getter。我如何强制它进行手动插入?谢谢
最佳答案
注意:我是EclipseLink JAXB (MOXy) JAXB 2 (JSR-222) 的领导者和成员专家组。
EclipseLink JAXB (MOXy) 有一个名为 @XmlInverseReference
的扩展,允许您映射后向指针。
产品
@Entity
@Table(name = "PC_PRODUCT")
public class Product extends LaunchEntity {
@XmlElement(name = "Product_To_Charge")
@OneToMany(mappedBy = "product", cascade=CascadeType.MERGE)
protected List<ChargeRelation> productToCharge;
}
收费关系
@XmlInverseReference
注释用于之前使用 @XmlTransient
的位置。 @XmlInverseReference
在编码操作期间的作用类似于 @XmlTransient
,并且将在解码操作期间填充反向指针。
@Entity
@Table(name="PC_CHARGE_RELATION")
public class ChargeRelation extends RelationEntity {
@XmlInverseReference(mappedBy = "productToCharge")
@ManyToOne(cascade=CascadeType.MERGE)
@JoinColumn(name="PRODUCT_ID")
protected Product product;
}
了解更多信息
关于database - 如何手动实现JPA关系OneToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10085182/