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 阅读(725) 评论(0)  编辑  收藏 所属分类: EJB


只有注册用户登录后才能发表评论。


网站导航: