【问题标题】:在 2 个表 JPA 之间创建关系
【发布时间】:2022-01-23 15:55:49
【问题描述】:

在设置表关系方面需要帮助。 因此,有 2 个实体 - Section 和 Period。 1 Section 有多个 Period,但 1 Period 不属于任何特定 Section。 我按如下方式实现了这种关系:在 Section 上创建了一个带有外部键的附加表 SectionCodes(更多在图表中)

节类:

@Entity
@Table(name = "section")
@AttributeOverride(name = "id", column = @Column(name = "id", nullable = false))
public class Section extends BaseEntity<Integer> {
    private String form;
    private Integer version;
    private List<SectionPeriod> periodCodes;

    @Column(name = "form")
    public String getForm() { return form; }
    public void setForm(String form) { this.form = form;}

    @Column(name = "version")
    public Integer version() { return version; }
    public void setVersion(Integer version) { this.version = version; }

    @OneToMany(mappedBy = "section", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    public List<SectionPeriod> getPeriodCodes() {
        return periodCodes;
    }
    public void setPeriodCodes(List<SectionPeriod> periodCodes) {
        this.periodCodes = periodCodes;
    }
}

节期:

@Entity
@Table(name="section_period")
@AttributeOverride(name = "id", column = @Column(name = "id", nullable = false))
public class SectionPeriod extends BaseEntity<Integer> {
    private Integer periodCode;
    private Section section;

    @Column(name = "period_code")
    public Integer getPeriodCode() {
        return periodCode;
    }
    public void setPeriodCode(Integer periodCode) {
        this.periodCode = periodCode;
    }

    @ManyToOne()
    @JoinColumn(name = "section_id", referencedColumnName = "id", nullable=false)
    public Section getSection () {
        return section;
    }
    public void setSection(Section section) {
        this.section = section;
    }
}

这很好用,但是有一个问题——原来每个 Section 实体都有一个 SectionPeriod 列表,而 SectionPerid 有一个 Section——所以有循环。 有没有简单的方法来执行此操作?理想情况下,它应该只是 Section 类中的 Period 列表,或者至少是 periodCodes 的 Integer[]。

【问题讨论】:

    标签: java sql spring jpa


    【解决方案1】:

    要对 Period 和 Section 之间的多对多关系建模,您有 2 个选择:

    1. 使用 2 个实体(期间、节),并在其中一个实体中使用 @ManyToMany 注释。这将自动生成具有复合主键的连接表。不建议这样做。
    2. 使用 3 个实体,这样您就可以认为“ManyToMany”具有两个 OneToMany 关系(1 个句点 - 许多“PeriodSection”和 1 个节 - 许多“PeriodSection”)。建议这样做,因为这样您将拥有一个 PK,并且您可以轻松地将更多列添加到 PeriodSection (** 注意:Entity 和 Table 应该有一个有意义的名称,而不是 PeriodSection,但我会留给你)

    使用第二个选项:

    期间:

    @Entity
    @Table(name = "periods")
    public class Period {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private Integer code;
    
    private String name;
    
    
    @OneToMany(mappedBy = "period", cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    private List<PeriodSection> periodSections;  // bad naming.
    
    }
    

    期间部分:

    @Entity
    @Table(name = "period_section")  // use a more meaningful name for the table and the entity
    public class PeriodSection {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "period_id", referencedColumnName = "id")
    private Period period;
    
    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "section_id", referencedColumnName = "id")
    private Section section;
    
    }
    

    部分:

    @Entity
    @Table(name = "sections")
    public class Section {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private Integer version;
    
    private String form;
    
    
    @OneToMany(mappedBy = "section", cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    private List<PeriodSection> periodSections;  // bad naming.
    
    }
    

    您可以尝试使用 fetch 和 cascade 策略,以检查哪种策略最适合您的应用。 希望这有帮助

    【讨论】:

    • 不,句号不属于任何特定部分。
    • 好的,我会编辑答案。给我 5 分钟。
    猜你喜欢
    • 2019-01-03
    • 2013-11-19
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多