【问题标题】:How to implement manually JPA relation OneToMany如何手动实现 JPA 关系 OneToMany
【发布时间】:2012-04-22 12:47:16
【问题描述】:

我正在使用 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。我怎样才能强制它进行手动插入?谢谢

【问题讨论】:

    标签: database jpa jpa-2.0 entity-relationship


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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;
      
      }
      

      收费关系

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

      更多信息

      【讨论】:

      • 我试过了,但没有用。我制作了一种递归方法来建立所有关系。现在它正在工作:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      相关资源
      最近更新 更多