0

個人の住所は次のようになります。

country: USA
state: Some state
city: N.Y.
Street: some stree name with buildings
Building: number of the building on the street

または、建物が複数のアパート/部屋で構成されている場合は、代わりに別のエンティティを使用する必要があります。

アパート/部屋: 建物内のアパートの番号

この例の次のすべてのレベルには、null にできない外部キーとして親レベルがあります。

郡 - 州のコンテナです

状態 - 都市などのコンテナです。

建物 - 部屋/アパートのコンテナである場合とそうでない場合があります。

その結果、各レベルに次の表があります。

country
id   name
1    USA

state
id  country_id name
2       1      N.Y.

city
id  state_id   name
3       2      New York

Street 
id  city_id    name
4       3      Some Street Name

Building
id  street_id  number
5       4       28

apartment
id  building_id number
8       5         36

私が遭遇した問題は、人をこのテーブル構造にマップする方法ですか? たとえば、大家族の家の場合、人はアパートに住んでいる場合と住んでいない場合があります。理想的には、いくつかのエンティティのコレクションが必要です:

ManyToMany
Collection<SomeEntity> addresses ...

whereSomeEntityはアパートまたは建物を直接参照できます。

以下は私が現在検討しているオプションですが、私はそれらが好きではありません。

建物またはアパートのいずれかのタイプを持つ最初のオプションは、次のSomeEntityようになります。

SomeEntity 
id person_id type       address_id
10    11     building     21
11    13     apartment    24

最初のケースでは address_id は建物のテーブルを参照し、2 番目のケースではアパートのテーブルを参照します。

2 番目のオプションは、次のフィールド リストを持つテーブルを作成することです。

SomeEntity
id  person_id  country_id  state_id city_id street_id building_id apartment_id

この場合、建物に部屋がない場合、apartment_id フィールドは null です。また、たとえば、市内/または路上に住んでいる人のリストを取得する必要がある場合にも役立ちます。住所関連のすべてのテーブルに参加する必要はなく、SomeEntity テーブルを参照するだけです。この表についてどう思いますか。この場合、Person オブジェクトをマップする方法は? SomeEntity - オブジェクトではなく単なるテーブルです。私のサービスは、実際には内部テーブル構造について何も知らないはずです。この問題は私には明確ではありません。おそらく、あなたはより良い解決策を提供することができます。

助けてください。

4

1 に答える 1

0

私のコメントに似たものがあなたの解決策である場合、あなたが尋ねたのは、休止状態で結合をマップする方法です。次のようになります。

@Entity
@Table(name = "TEST_TABLE_A")
public class TestTableA {
    public TestTableA(){

    }
    public TestTableA(String aName){
        this.aName = aName;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "A_ID")
    private Long id;

    @Column(name = "A_NAME")
    private String aName;

    //some other atribut here

    @ManyToMany(cascade = CascadeType.REFRESH)
    @JoinTable(name="A_JOIN_B",
            joinColumns={@JoinColumn(name="A_ID")},
            inverseJoinColumns={@JoinColumn(name="B_ID")})
    private Set<TestTableB> testJoins = new HashSet<TestTableB>();
    //Getters and setters of all the collumn here
}

TEST_TABLE_A はデータベース内の BUILDING テーブルであり、TestTableB はアパートメント エンティティであると想定できます。A_JOIN_B は SOME_ENTITY テーブルで、testJoins は探しているオブジェクトです。建物からそのオブジェクトを取得する必要があります。

必要に応じて、関係を @OneToMany に変更することもできます。Cascade.Type (カスケードに関する詳細)を変更して、そのテーブルを維持しやすくします。

于 2013-07-21T22:14:49.190 に答える