代码之家  ›  专栏  ›  技术社区  ›  dharga

JPA许多参考问题

  •  2
  • dharga  · 技术社区  · 16 年前

    我有三张桌子。AvailableOptions和PlantTypeRef,具有名为AvailoptionPlantTypeAssoc的多个关联表。精简的模式如下所示

    CREATE TABLE [dbo].[AvailableOptions](
      [SourceApplication] [char](8) NOT NULL,
      [OptionId] [int] IDENTITY(1,1) NOT NULL,
      ...
    )
    
    CREATE TABLE [dbo].[AvailOptionPlanTypeAssoc](
      [SourceApplication] [char](8) NOT NULL,
      [OptionId] [int] NOT NULL,
      [PlanTypeCd] [char](2) NOT NULL,
    )
    
    CREATE TABLE [dbo].[PlanTypeRef](
      [PlanTypeCd] [char](2) NOT NULL,
      [PlanTypeDesc] [varchar](32) NOT NULL,
    )
    

    Java代码如下所示。

    //AvailableOption.java
    @ManyToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
    @JoinTable(
      name = "AvailOptionPlanTypeAssoc",
      joinColumns = { @JoinColumn(name = "OptionId"),
                      @JoinColumn(name="SourceApplication")},
      inverseJoinColumns=@JoinColumn(name="PlanTypeCd"))
    List<PlanType> planTypes = new ArrayList<PlanType>();
    
    //PlanType.java
    @ManyToMany
    @JoinTable(
      name = "AvailOptionPlanTypeAssoc",
      joinColumns = { @JoinColumn(name = "PlanTypeCd")},
      inverseJoinColumns={@JoinColumn(name="OptionId"),
                          @JoinColumn(name="SourceApplication")})
    List<AvailableOption> options = new ArrayList<AvailableOption>();
    

    SELECT t0.OptionId, 
      t0.SourceApplication, 
      t2.PlanTypeCd, 
      t2.EffectiveDate, 
      t2.PlanTypeDesc, 
      t2.SysLstTrxDtm, 
      t2.SysLstUpdtUserId, 
      t2.TermDate 
    FROM dbo.AvailableOptions t0 
      INNER JOIN dbo.AvailOptionPlanTypeAssoc t1 
        ON t0.OptionId = t1.OptionId AND t0.SourceApplication = t1.SourceApplication 
      INNER JOIN dbo.AvailableOptions t2 
        ON t1.PlanTypeCd = t2.PlanTypeCd 
    WHERE (t0.SourceApplication = ? AND t0.OptionType = ?) 
    ORDER BY t0.OptionId ASC, t0.SourceApplication ASC 
    [params=(String) testApp, (String) junit0]}
    
    1 回复  |  直到 16 年前
        1
  •  3
  •   David    16 年前

    您正在映射双向关联。这意味着你必须选择一方作为协会的所有者。这一方将负责更新数据库中的关系。

    //AvailableOption.java
    @ManyToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
    @JoinTable(
      name = "AvailOptionPlanTypeAssoc",
      joinColumns = { @JoinColumn(name = "OptionId"),
                      @JoinColumn(name="SourceApplication")},
      inverseJoinColumns=@JoinColumn(name="PlanTypeCd"))
    List<PlanType> planTypes = new ArrayList<PlanType>();
    
    //PlanType.java
    @ManyToMany(
        mappedBy = "planTypes"
    )
    List<AvailableOption> options = new ArrayList<AvailableOption>();
    

    你也可以参考 hibernate annotation documentation chapter 2.2.5

    大卫

    推荐文章