EJB3.0之映射(轉)
一對一映射
雙向一對一關系需要在關系維護端(owner side)的one2one Annotition定義mappedBy屬性。建表時在關系被維護端(inverse side)建立外鍵列指向關系維護端的主鍵列。
假設Country 和 Capital 是雙向一對一的關系,具體元數據聲明如下:
public class Country { @OneToOne(optional = true,cascade = CascadeType.ALL, mappedBy = "country") private Capital capital; } public class Capital { @OneToOne(optional = false, cascade = CascadeType.ALL) @JoinColumn(name = "COUNTRY_ID", referencedColumnName = "id") private Country country;
代碼中元數據的說明:
元數據描述:
@OneToOne(optional = true,cascade = CascadeType.ALL, mappedBy = "country")
optional聲明關系是否是必須存在的,即是否允許其中一端為null。
cascade聲明級聯操作。
@JoinColumn(name = "COUNTRY_ID", referencedColumnName = "id")
name聲明外鍵列的名字,referencedColumnName聲明外鍵指向列的列名。
一對多映射
雙向一對多關系,一是關系維護端(owner side),多是關系被維護端(inverse side)。 建表時在關系被維護端建立外鍵列指向關系維護端的主鍵列。
假設Father 和 Child 是雙向一對多的關系,具體元數據聲明如下:
public class Father { @OneToMany(targetEntity = Child.class, cascade = CascadeType.ALL, mappedBy = "father") public List<Child> getChildren() { return children; } } public class Child { @ManyToOne @JoinColumn(name = "FATHER_ID", referencedColumnName = "id") public Father getFather() { return father; } }
代碼中元數據的說明:
元數據描述:
@OneToMany(targetEntity = Child.class, cascade = CascadeType.ALL, mappedBy = "father")
targetEntity = Child.class表明關系另一端的實體類型
cascade聲明級聯操作。
mappedBy聲明關系維護端的字段(field)名。
@ManyToOne
@JoinColumn(name = "FATHER_ID", referencedColumnName = "id")
name聲明外鍵列的名字,referencedColumnName聲明外鍵指向列的列名。
多對多映射
多對多映射采取中間表連接的映射策略,建立的中間表將分別引入兩邊的主鍵作為外鍵。
EJB3對于中間表的元數據提供了可配置的方式,用戶可以自定義中間表的表名,列名。
假設Teacher 和 Student是多對多的關系,具體元數據聲明如下:
pubic class Teacher{ @ManyToMany(targetEntity = Student.class, cascade = CascadeType.PERSIST) @JoinTable(table = @Table(name = "M2M_TEACHER_STUDENT"), joinColumns = @JoinColumn(name = "TEACHER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "STUDENT_ID", referencedColumnName = "ID")) public List<Student> getStudents() {return students;} } public class Student{ @ManyToMany(targetEntity = Teacher.class, mappedBy = "students") public List<Teacher> getTeachers() { return teachers; } }
代碼中元數據的說明:
元數據描述:
@ManyToMany(targetEntity = Student.class, cascade = CascadeType.PERSIST)
targetEntity = Student.class表明關系另一端的實體類型。cascade聲明級聯操作。
@JoinTable(table = @Table(name = "M2M_TEACHER_STUDENT"),
joinColumns = @JoinColumn(name = "TEACHER_ID", referencedColumnName = "ID"),
inverseJoinColumns = @JoinColumn(name = "STUDENT_ID", referencedColumnName = "ID"))
JoinTable配置中間表信息,它由3個部分組成:
1) table = @Table(name = "M2M_TEACHER_STUDENT") ,聲明中間表的名字
2) joinColumns ,定義中間表與關系維護端的外鍵關系。
3) inverseJoinColumns,定義中間表與inverse端的外鍵關系.
Inheritance strategy
EJB3規定了三種基本的繼承映射策略:
.每個類分層結構一張表(table per class hierarchy)
.每個子類一張表(table per subclass)
.每個具體類一張表(table per concrete class)
在我們提供的Alpha版本中僅支持第一種映射策略,即每個類層次一個表。我們將在下一個版本中提供每個具體類一張表的支持, 考慮到性能,這兩個映射策略也是推薦的映射策略.
每個類分層結構一張表(Table per class hierarchy)
假設有這么一個繼承類層次:Employee,兩個子類FullTimeEmployee,PartTimeEmployee 源代碼如下所示:@Entity @Table( name="inheritance_Employee" ) @Inheritance(strategy=InheritanceType.SINGLE_TABLE, discriminatorType=DiscriminatorType.STRING, discriminatorValue="employee") public class Employee {...} @Entity @Inheritance(discriminatorValue="fullTimeEmp") public class FullTimeEmployee extends Employee {...} @Entity @Inheritance(discriminatorValue="partTimeEmp") public class PartTimeEmployee extends Employee {...}
代碼中元數據的說明:
基類中元數據描述:
@Inheritance(strategy=InheritanceType.SINGLE_TABLE,
discriminatorType=DiscriminatorType.STRING,discriminatorValue="employee")
strategy=InheritanceType.SINGLE_TABLE表示繼承映射采用第一種映射策略。
discriminatorType=DiscriminatorType.STRING表示繼承層次中類型識別列類型為String.
discriminatorValue="employee" 表示此類對應的類型識別碼為employee.
posted on 2006-07-03 00:52 liaojiyong 閱讀(737) 評論(0) 編輯 收藏 所屬分類: EJB