一對(duì)一映射
雙向一對(duì)一關(guān)系需要在關(guān)系維護(hù)端(owner side)的one2one Annotition定義mappedBy屬性。建表時(shí)在關(guān)系被維護(hù)端(inverse side)建立外鍵列指向關(guān)系維護(hù)端的主鍵列。
假設(shè)Country 和 Capital 是雙向一對(duì)一的關(guān)系,具體元數(shù)據(jù)聲明如下:
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;
代碼中元數(shù)據(jù)的說(shuō)明:
元數(shù)據(jù)描述:
@OneToOne(optional = true,cascade = CascadeType.ALL, mappedBy = "country")
optional聲明關(guān)系是否是必須存在的,即是否允許其中一端為null。
cascade聲明級(jí)聯(lián)操作。
@JoinColumn(name = "COUNTRY_ID", referencedColumnName = "id")
name聲明外鍵列的名字,referencedColumnName聲明外鍵指向列的列名。
一對(duì)多映射
雙向一對(duì)多關(guān)系,一是關(guān)系維護(hù)端(owner side),多是關(guān)系被維護(hù)端(inverse side)。 建表時(shí)在關(guān)系被維護(hù)端建立外鍵列指向關(guān)系維護(hù)端的主鍵列。
假設(shè)Father 和 Child 是雙向一對(duì)多的關(guān)系,具體元數(shù)據(jù)聲明如下:
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;
}
}
代碼中元數(shù)據(jù)的說(shuō)明:
元數(shù)據(jù)描述:
@OneToMany(targetEntity = Child.class, cascade = CascadeType.ALL, mappedBy = "father")
targetEntity = Child.class表明關(guān)系另一端的實(shí)體類(lèi)型
cascade聲明級(jí)聯(lián)操作。
mappedBy聲明關(guān)系維護(hù)端的字段(field)名。
@ManyToOne
@JoinColumn(name = "FATHER_ID", referencedColumnName = "id")
name聲明外鍵列的名字,referencedColumnName聲明外鍵指向列的列名。
多對(duì)多映射
多對(duì)多映射采取中間表連接的映射策略,建立的中間表將分別引入兩邊的主鍵作為外鍵。
EJB3對(duì)于中間表的元數(shù)據(jù)提供了可配置的方式,用戶可以自定義中間表的表名,列名。
假設(shè)Teacher 和 Student是多對(duì)多的關(guān)系,具體元數(shù)據(jù)聲明如下:
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;
}
}
代碼中元數(shù)據(jù)的說(shuō)明:
元數(shù)據(jù)描述:
@ManyToMany(targetEntity = Student.class, cascade = CascadeType.PERSIST)
targetEntity = Student.class表明關(guān)系另一端的實(shí)體類(lèi)型。cascade聲明級(jí)聯(lián)操作。
@JoinTable(table = @Table(name = "M2M_TEACHER_STUDENT"),
joinColumns = @JoinColumn(name = "TEACHER_ID", referencedColumnName = "ID"),
inverseJoinColumns = @JoinColumn(name = "STUDENT_ID", referencedColumnName = "ID"))
JoinTable配置中間表信息,它由3個(gè)部分組成:
1) table = @Table(name = "M2M_TEACHER_STUDENT") ,聲明中間表的名字
2) joinColumns ,定義中間表與關(guān)系維護(hù)端的外鍵關(guān)系。
3) inverseJoinColumns,定義中間表與inverse端的外鍵關(guān)系.
Inheritance strategy
EJB3規(guī)定了三種基本的繼承映射策略:
.每個(gè)類(lèi)分層結(jié)構(gòu)一張表(table per class hierarchy)
.每個(gè)子類(lèi)一張表(table per subclass)
.每個(gè)具體類(lèi)一張表(table per concrete class)
在我們提供的Alpha版本中僅支持第一種映射策略,即每個(gè)類(lèi)層次一個(gè)表。我們將在下一個(gè)版本中提供每個(gè)具體類(lèi)一張表的支持, 考慮到性能,這兩個(gè)映射策略也是推薦的映射策略.
每個(gè)類(lèi)分層結(jié)構(gòu)一張表(Table per class hierarchy)
假設(shè)有這么一個(gè)繼承類(lèi)層次:Employee,兩個(gè)子類(lèi)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 {...}
代碼中元數(shù)據(jù)的說(shuō)明:
基類(lèi)中元數(shù)據(jù)描述:
@Inheritance(strategy=InheritanceType.SINGLE_TABLE,
discriminatorType=DiscriminatorType.STRING,discriminatorValue="employee")
strategy=InheritanceType.SINGLE_TABLE表示繼承映射采用第一種映射策略。
discriminatorType=DiscriminatorType.STRING表示繼承層次中類(lèi)型識(shí)別列類(lèi)型為String.
discriminatorValue="employee" 表示此類(lèi)對(duì)應(yīng)的類(lèi)型識(shí)別碼為employee.