0

Java/Spring で次の問題があります。

より具体的なケースで問題を最大限に単純化しようとしました。要約すると、国というクラスがあり、それぞれの国が多くの都市にリンクされています。各都市は、中間クラスの道路で別の都市にリンクされています。

私はそのように実装しましたが (以下を参照)、Road オブジェクトに冗長性があり、都市と国属性によって Country にリンクされているため、これでは満足できません (たとえば、複製、すなわち、道路パリ-リヨンと道路リヨン-パリ)。

別の精度ですが、クロスカントリーはありません。国の下のすべての道路と都市は同じ国に属しています。

public class Country implements Serializable {
    ...

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "country")
    private List<City> cities;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "country")
    private List<Road> roads;
}

public class City implements Serializable {
    ...

    @ManyToOne(optional = false)
    @JoinColumn(name = "countryId", referencedColumnName = "id")
    private Country country;
}

public class Road implements Serializable {
    // Unicity by the corresponding 3 items countryId, cityFromId and cityToId
    ...

    @ManyToOne(optional = false)
    @JoinColumn(name = "countryId", referencedColumnName = "id")
    private Country country;


    @ManyToOne(optional = false)
    @JoinColumn(name = "cityFromId", referencedColumnName = "id")
    private City cityFrom;


    @ManyToOne(optional = false)
    @JoinColumn(name = "cityToId", referencedColumnName = "id")
    private City cityTo;
}

この重複した参照を避けるために、Road クラスの Country クラスへの参照を削除することを想像できますが、これは @OneToMany またはクラス City の Road への参照を追加することを意味します。道路が 2 つの都市を結んでいるため、循環参照になります (以下を参照)。

public class Country implements Serializable {
    ...

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "country")
    private List<City> cities;
}

public class City implements Serializable {
    ...

    @ManyToOne(optional = false)
    @JoinColumn(name = "countryId", referencedColumnName = "id")
    private Country country;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "cityFrom")
    private List<Road> cityFromRoad;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "cityTo")
    private List<Road> cityToRoad;
}

public class Road implements Serializable {
    // Unicity by the corresponding 3 items countryId, cityFromId and cityToId
    ...


    @ManyToOne(optional = false)
    @JoinColumn(name = "cityFromId", referencedColumnName = "id")
    private City cityFrom;


    @ManyToOne(optional = false)
    @JoinColumn(name = "cityToId", referencedColumnName = "id")
    private City cityTo;
}

私のモデルを作るためのより良い方法を見つけるのを手伝ってくれませんか?

どうもありがとう!

4

1 に答える 1