EJB 3.0 允許單一實體 Bean 映射多張資料表,透過 @SecondaryTable 與 @SecondaryTables 註解實現。常見於字典表、擴展屬性表等場景。本文以「學生-性別字典表」為例完整演示。
@SecondaryTable(
name = "GENDER", // 次要表名
catalog = "", // 目錄
schema = "", // 模式
join = @JoinColumn(name="GENDER_ID"), // 聯結欄位
uniqueConstraints = {} // 唯一約束
)
@SecondaryTables({
@SecondaryTable(name = "TABLE1", join = @JoinColumn(name="ID1")),
@SecondaryTable(name = "TABLE2", join = @JoinColumn(name="ID2"))
})
package com.kuaff.ejb3.secondary;
import javax.persistence.*;
@Entity
@Table(name = "STUDENT")
@SecondaryTables({
@SecondaryTable(name = "GENDER",
join = @JoinColumn(name = "GENDER_ID"))
})
public class Student implements Serializable {
private int id;
private Name name; // 內嵌值物件
private String grade;
private String email;
private String gender; // 映射到 GENDER 表
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public int getId() { return id; }
public void setId(int id) { this.id = id; }
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "first", column = @Column(name = "FIRST")),
@AttributeOverride(name = "last", column = @Column(name = "LAST"))
})
public Name getName() { return name; }
public void setName(Name name) { this.name = name; }
@Column(name = "GRADE")
public String getGrade() { return grade; }
public void setGrade(String grade) { this.grade = grade; }
@Column(name = "EMAIL")
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
// 關鍵:secondaryTable 指定次要表
@Column(name = "gender", table = "GENDER")
public String getGender() { return gender; }
public void setGender(String gender) { this.gender = gender; }
}
@Embeddable
public class Name implements Serializable {
private String first;
private String last;
// getter/setter 略
}
@Remote
public interface StudentDAO {
int create(String first, String last, String grade, String email, String gender);
List<Student> findAll();
void evict(Student s);
}
public class Client {
public static void main(String[] args) throws NamingException {
InitialContext ctx = new InitialContext();
StudentDAO dao = (StudentDAO) ctx.lookup(StudentDAO.class.getName());
dao.create("晁", "岳攀", "8", "smallnest@kuaff.com", "男");
dao.create("朱", "立煥", "6", "zhuzhu@kuaff.com", "女");
for (Student s : dao.findAll()) {
System.out.printf("%s%s的性別:%s%n",
s.getName().getFirst(), s.getName().getLast(), s.getGender());
dao.evict(s);
}
}
}
run.bat -c allhttps://localhost:8080/jmx-console/... 調用 startDatabaseManager()@SecondaryTable 的 join 屬性必須指定主鍵關聯欄位@Column(table = "SECONDARY_TABLE") 指定映射目標表@SecondaryTable 組合複雜映射@Embedded)配合 @AttributeOverride 映射同表多欄位