2012-04-10 79 views
2

我正在使用JPA批注,并且当我有关系OneToMany - ManyToOne,当我在ManyToOne中看到我的实体时,joinColumn始终为null值。如何手动实现JPA关系OneToMany

接下来,我会告诉我的例子,我有产品

@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和getters。我如何强制这个手动插入?谢谢

回答

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

更多信息

+0

我尝试,但没有奏效。我做了一个递归的方法来建立所有的关系。现在它工作:) – 2012-04-13 07:46:22

2

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

但是,JAXB仅在XML解组过程中填充一对多一侧,因此需要在解组后编译多对一侧。