有 時您必須將同一個物件實體中的屬性,映射至兩個表格,例如,您有一個User類別,其中name與age屬性要映射至T_USER表格,而email、 blog、twitter屬性要映射至T_CONTACT表格,T_USER與T_CONCACT表格分別擁有自己的主鍵ID為USER_ID與 CONTACT_ID。
您可以使用@SecondTable來標註User物件所要映射的其它表格,例如:
- User.java
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 {
...
}
@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來標註將映射至哪個表格。