如何手动实现JPA关系OneToMany

时间:2012-04-10 08:02:20

标签: database jpa jpa-2.0 entity-relationship

我正在使用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文件,为字符串转换数据,为我的根对象制作unmarshall并保留此对象。

问题是当我在字符串中找到电荷关系时,值会插入电荷关系表,但带有product_id的列始终为空。< / p>

我已经定义了所有的setter和getter。我怎么强迫这个来手动插入?感谢

2 个答案:

答案 0 :(得分:2)

请注意,JPA提供程序在将数据保存到数据库时反映了多对一关系的状态。

但是,JAXB仅在XML解组期间填充一对多的一面,因此您需要在解组后手动填充多对一的一面。

答案 1 :(得分:2)

注意:我是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;

}

<强> ChargeRelation

@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;
}

了解更多信息