|
有
時您必須將同一個物件實體中的屬性,映射至兩個表格,例如,您有一個User類別,其中name與age屬性要映射至T_USER表格,而email、
blog、twitter屬性要映射至T_CONTACT表格,T_USER與T_CONCACT表格分別擁有自己的主鍵ID為USER_ID與
CONTACT_ID。
您可以使用@SecondTable來標註User物件所要映射的其它表格,例如:
package onlyfun.caterpillar;
import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.SecondaryTable; import javax.persistence.Table;
@Entity @Table(name="T_USER") @SecondaryTable(name="T_CONTACT", pkJoinColumns={ @PrimaryKeyJoinColumn(name="CONTACT_ID")}) public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="USER_ID") private Long id; private String name; private Long age;
@Column(name="email", table="T_CONTACT") private String email;
@Column(name="blog", table="T_CONTACT") private String blog;
@Column(name="twitter", table="T_CONTACT") private String twitter;
public Long getAge() { return age; } public void setAge(Long age) { this.age = age; }
public String getBlog() { return blog; } public void setBlog(String blog) { this.blog = blog; }
public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }
public Long getId() { return id; } public void setId(Long id) { this.id = id; }
public String getName() { return name; } public void setName(String name) { this.name = name; }
public String getTwitter() { return twitter; } public void setTwitter(String twitter) { this.twitter = twitter; } }
在@SecondTable中,必須指定所映射的第二個表格名稱,並使用內嵌的@PrimaryKeyJoinColumn來標註所要連結的主鍵欄位,該
主鍵欄位值將與T_USER的主鍵欄位值同步。而在對應於第二個表格的屬性,則必須使用@Column標註出來,表明其對應哪一個表格的哪一個欄位。
如果您使用EntityManager來儲存User物件,則會分別將屬性儲存至所設定的對應欄位,而在查找時,則會使用left outer join從兩個表格中擷取欄位值,在刪除物件時,則會從兩個表格中刪除對應的資料。
如果一個實體物件所要映射的表格不只有兩個,而有兩個以上的話,則使用@SecondaryTables標註,而在內嵌的部份,再使用@SecnondTable分別標註出所要映射的表格,例如:
@Entity
@Table(name="CUSTOMER_TABLE")
@SecondaryTables({
@SecondaryTable(name="T_CONTACT",
pkJoinColumns={@PrimaryKeyJoinColumn (name="CONTACT_ID")}),
@SecondaryTable(name="T_OOO",
pkJoinColumns={@PrimaryKeyJoinColumn (name="OOO_ID")}),
@SecondaryTable(name="T_XXX",
pkJoinColumns={@PrimaryKeyJoinColumn (name="XXX_ID")})
})
public class User implements Serializable {
...
}
而User類別中的屬性,同樣使用@Column來標註將映射至哪個表格。
|