love fish大鵬一曰同風起,扶搖直上九萬里

          常用鏈接

          統計

          積分與排名

          friends

          link

          最新評論

          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

          主站蜘蛛池模板: 柘城县| 阜南县| 田林县| 应用必备| 炎陵县| 双鸭山市| 吉林省| 西畴县| 南安市| 柳江县| 永德县| 福贡县| 临沧市| 潮安县| 岑溪市| 湖南省| 南召县| 安徽省| 香港| 辽阳市| 华安县| 汉沽区| 庆城县| 莱西市| 沙河市| 哈巴河县| 萨嘎县| 清新县| 海城市| 宜章县| 鄂温| 安溪县| 白银市| 扶沟县| 通江县| 寻甸| 广西| 玛多县| 车致| 游戏| 阜阳市|