2013-07-17 90 views
0

我希望我可以清楚地解釋這第一次嘗試。所以我有兩個實體:人員和地址。一個人可以有很多地址,所以我的Person實體由一個地址列表組成。請注意,地址可以在不同的人之間共享,但是我的Address實體不需要對Person實體的引用。此外,每個地址實體將具有排名屬性。JPA - @OneToMany與JoinTable

我的表結構如下:

PERSON (
    person_id, 
    etc, 
    primary key (person_id) 
) 

ADDRESS (
    address_id, 
    etc, 
    primary key (address_id) 
) 

PERSON_ADDRESS_MAP (
    person_id, 
    address_id, 
    rank, 
    foreign key (person_id) references person (person_id), 
    foreign key (address_id) references address (address_id), 
    primary key (person_id, address_id, rank) 
) 

鑑於上述情況,我不知道如何註釋我的人的地址列表,或在地址秩屬性。我懷疑的人將如下所示:

@Entity 
public class Person { 
    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinTable(name="person_address_map", [email protected](name="person_id"), [email protected](name="address_id")) 
    private List<Address> addresses; 
    ... 
} 

我在如何註釋排名在地址實體無能。

在此先感謝

+0

正文說排名在Address中,但在表格描述中說它在PERSON_ADDRESS_MAP中。哪一個是真的? –

+0

兩者都是如此。 Rank是Address實體的一個屬性,但它存儲在連接表中,因爲一個人的一個地址可能與另一個人的地址不同。例如,鮑勃將地址'A'作爲他的第一個地址,但瑪麗(住在同一地址)將她的第二個地址評爲'A'。 – user1491636

回答

0

首先,人與地址之間的邏輯關聯是多到多,因爲一個人有多個地址,住址是由許多人共享。

你說的排名是Address的一個屬性。但是對於給定的地址,等級可以是1(對於鮑勃)或2(對於瑪麗)。這只是簡單地表明(並且表格模型清楚地顯示)該等級不是Address的一個屬性。

所以,解決問題的方法很簡單:你必須在PERSON_ADDRESS_MAP表映射到實體:

public class Person { 
    @OneToMany(mappedBy = "person") 
    private Set<RankedAddress> rankedAddresses; 
} 

public class RankedAddress { 
    @ManyToOne 
    private Person person; 

    @ManyToOne 
    private Address address; 
} 

public class Address { 
    @OneToMany(mappedBy = "adress") 
    private Set<RankedAddress> rankedAddresses; 
} 

我也勸你,爲所有實體,增加一個單列,自動生成的ID(和相應的列)到RankingAddress實體。

如果rank是連接表的唯一附加,並且如果它用於包含某個人的地址列表中每個地址的索引(即它從0到N-1,N是一個地址的數目用戶),然後有一個選擇,不強制你映射連接表的實體:

public class Person { 
    @ManyToMany 
    @OrderColumn(name = "rank") 
    private List<Address> addresses; 
} 

注意,列的值將完全JPA辦理,也只會是用於存儲列表中給定索引處的每個地址。它不可用於查詢,除了通過列表中的索引之外,您無法知道某人的地址等級。

+0

替代方案是我正在尋找的。謝謝! – user1491636