具有超类双向关系的JPA注释

时间:2016-06-23 08:37:58

标签: java database spring jpa

我正在尝试将JPA注释添加到我的模型中。

这是我的超类的一部分:

@Entity
@Table(name="destinations")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Destination {
    protected abstract Destination getParent();
    protected abstract Set<Destination> getChildren();
}

这些是实施:

@Entity
@DiscriminatorValue(value = "country")
public class Country extends Destination {
    private Set<Destination> regions;
    private Set<Destination> cities;

    @Override
    public Destination getParent() {
        return null;
    }

    @Override
    public Set<Destination> getChildren() {
        if (regions != null && !regions.isEmpty()) {
            return regions;
        }
        return cities;
    }
}

@Entity
@DiscriminatorValue(value = "region")
public class Region extends Destination {
    private Set<Destination> cities;
    private Country country;

    @Override
    public Destination getParent() {
        return country;
    }

    @Override
    public Set<Destination> getChildren() {
        return cities;
    }
}

@Entity
@DiscriminatorValue(value = "city")
public class City extends Destination {
    private Country country;
    private Region region;

    @Override
    public Destination getParent() {
        if (region != null) {
            return region;
        }
        return country;
    }

    @Override
    public Set<Destination> getChildren() {
        return null;
    }
}

因此,有些国家的城市都有城市,没有区域但有城市的国家。

如何对这些类进行注释,以便它们的双向关系可以保留,并且所有目标都在一个表中?

1 个答案:

答案 0 :(得分:0)

  • 理想情况下,我的理解设计应该是这样的

    国家&lt; ----&gt;城市

    国家&lt; ----&gt;区域

    城市&lt; ----&gt;地区

  • 考虑到该区域可能存在或不存在,我们需要具有强制性的Country to City映射和与Region相关的可选映射。

  • 现在根据您的要求,您需要将所有这些内容与Destination相关联,这意味着根据上面显示的当前设计,您将拥有多个值

  • 例如。国家(IND) - 区(MH) - 城市(MUM);然后,您将在目的地中的2行中使用Country-City和其他Country-Region

  • 因此,我的最终结论是,如果你选择继承设计,你将最终拥有多行,如前面的例子中所解释的那样,如果你只是使用OneToOne / OneToMany映射,如你所示的那样,对于Country持续两次城市和国家/地区

相关问题