如何在JPA中表示一对多关系,中间有多个表?

时间:2014-02-05 18:34:15

标签: java jpa eclipselink spring-data-jpa

在高级别,我有一个“MainClass”类,其中包含“OtherEntity”列表。基本上有两个连接表。这两个连接表中包含其他组件使用的元数据,但我没有定义实体,因为我们在连接操作之外不需要它们。但基本上MainClass => TableOne => TableTwo => OtherEntity

我的实体定义

@Entity
public class MainClass {

    // other stuff ...

    // how to?
    @OneToMany
    private List<OtherEntity> otherEntities;
}


@Entity
public class OtherClass { // other stuff ... }

我的架构(遗留且无法修改)

table MainClass
    PK id
    ...

table TableOne
    PK id
    FK main_class_id
    FK table_two_id

table TableTwo
    PK id
    FK table_one_id
    FK other_entity_id

table OtherEntity
     PK id
     ...

如果可以的话,我想避免为TableOne和TableTwo创建实体。

2 个答案:

答案 0 :(得分:1)

考虑使用@SecondaryTable它应该适用于遗留模式,使用此注释可以在一个实体中包含字段,并且只定义哪些将构成其他表的一部分,但是您只有2个实体。

检查this教程

Idea是来自不同表中的一个实体的拆分字段,无需创建其他实体,只需定义哪个字段位于哪个表中。

@SecondaryTables{@SecondaryTable(name="XX")} 

并在表之间移动字段使用

@Column(table="XX")

在你的配置中尝试这样的事情。

@Entity
@SecondaryTables{@SecondaryTable(name="TableOne"), @SecondaryTable(name="TableTwo")}
table MainClass
    PK id
    @Column(table="TableOne")
    FK main_class_id
    @Column(table="TableOne")
    FK table_two_id

    @Column(table="TableTwo")
    PK id
    @Column(table="TableTwo")
    FK table_one_id
    @Column(table="TableTwo")
    FK other_entity_id

对于中间表中的ID,请考虑删除@Id并自动设置它,它应该工作!!

答案 1 :(得分:0)

问题是最终会解决的设计问题。我们有一个数据库视图,提供统一的查找表。在数据库层,我们可以单独分配各个部分。

@Entity
public class MainClass {

    @OneToMany
    @JoinTable(name = "TheViewName", 
        joinColumns = @JoinColumn(name = "id", insertable = false, updatable= false), 
        inverseJoinColumns = @JoinColumn(name = "other_id", insertable = false, 
            updatable = false))
    private List<OtherEntity> otherEntities;
}

这意味着我无法将新的其他实体分配给MainClass并保持两者。我必须做两个单独的操作才能完成任务。但是,当我们重构模式时,这将消失。

或者,我们可以为其他两个表创建实体,以使操作更加透明。