EJB3学习笔记之 EJB3中的注释(三)
关键字: ejb3 ejb注释 ejb学习笔记
8. 关系 / 对象映射
A. 一对多
@OneToMany 指明关联关系为一对多关系,下面是 @OneToMany 注释的属性:
1. targetEntity
Class 类型的属性。
定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。
2. mappedBy
String 类型的属性。
定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,否则可能引起数据一致性的问题。
3. cascade
CascadeType[] 类型。
该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。举个例子: Order 和 OrderItem 有级联关系,那么删除 Order 时将同时删除它所对应的 OrderItem 对象。而如果 OrderItem 还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。 cascade 的值只能从 CascadeType.PERSIST (级联新建)、 CascadeType.REMOVE (级联删除)、 CascadeType.REFRESH (级联刷新)、 CascadeType.MERGE (级联更新)中选择一个或多个。还有一个选择是使用 CascadeType.ALL ,表示选择全部四项。
4. fatch
FetchType 类型的属性。
可选择项包括: FetchType.EAGER 和 FetchType.LAZY 。前者表示关系类 ( 本例是 OrderItem 类 ) 在主类 ( 本例是 Order 类 ) 加载的时候同时加载,后者表示关系类在被访问时才加载。默认值是 FetchType. LAZY 。
@OrderBy(value = "id ASC") 注释指明加载 OrderItem 时按 id 的升序排序
B. 多对一
1. @ManyToOne 注释,有四个属性: targetEntity 、 cascade 、 fetch 和 optional ,前三个属性的具体含义和 @OneToMany 注释的同名属性相同,但 @ManyToOne 注释的 fetch 属性默认值是 FetchType.EAGER 。 optional 属性是定义该关联类对是否必须存在,值为 false 时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为 null 。值为 true 时 , 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为 null 。 optional 属性的默认值是 true 。举个例:某项订单 (Order) 中没有订单项 (OrderItem) ,如果 optional 属性设置为 false ,获取该项订单( Order )时,得到的结果为 null ,如果 optional 属性设置为 true ,仍然可以获取该项订单,但订单中指向订单项的属性为 null 。实际上在解释 Order 与 OrderItem 的关系成 SQL 时, optional 属性指定了他们的联接关系 optional=false 联接关系为 inner join,optional=true 联接关系为 left join 。
@JoinColumn(name = "order_id") 注释指定 OrderItem 映射表的 order_id 列作为外键与 Order 映射表的主键列关联。
C. 一对一
1. @OneToOne 注释,有五个属性: targetEntity 、 cascade 、 fetch 、 optional 和 mappedBy, 前四个属性的具体含义与 @ManyToOne 注释的同名属性一一对应, fetch 属性默认值是 FetchType.EAGER 。 mappedBy 属性的具体含义与 @OneToMany 注释的同名属性相同。如果 optional = true 设置表明此属性可以为 null, 例如在身份证的处理时可以这样设置,因为未成年人就是没有身份证的。
D. 多对多
1. @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端,注意: mappedBy 属性的值为此关系的另一端的属性名。例如,在 Student 类中有如下方法:
@ManyToMany(mappedBy = "students")
public Set<Teacher> getTeachers() {
return teachers;
}
那么这里的“ students ”就是 Teachers 的一个属性,通常应该是这样的:
Set<Student> students;
另一端的 getStudents 方法如下所示:
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},
inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")})
public Set<Student> getStudents() {
return students;
}
@ManyToMany 注释表示 Teacher 是多对多关系的一端。 @JoinTable 描述了多对多关系的数据表关系。 name 属性指定中间表名称, joinColumns 定义中间表与 Teacher 表的外键关系。上面的代码中,中间表 Teacher_Student 的 Teacher_ID 列是 Teacher 表的主键列对应的外键列, inverseJoinColumns 属性定义了中间表与另外一端 (Student) 的外键关系。
EJB3学习笔记之 EJB3中的注释(一)
EJB3学习笔记之 EJB3中的注释(二)
EJB3学习笔记之 EJB3中的注释(三)
EJB3学习笔记之 EJB3中的注释(四)
EJB3学习笔记之 EJB3中的注释(五)
- 14:54
- 浏览 (556)
- 评论 (0)
- 分类: JavaEE技术
- 进入论坛
- 发布在 JBoss SEAM 圈子
- 相关推荐
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 49483 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
共 12 张
最近加入圈子
最新评论
-
Gwt-Ext学习笔记之基础篇
请问:为什么我的没有这项出来呢?在 Configurations中选择 Cypa ...
-- by bh_nesta -
Gwt-Ext学习笔记之中级篇
我增加了一个搜索的.代码入下: GridSearc ...
-- by pindai -
Birt报表金额大小写转换
hmm,推荐把这样的代码作为一个函数保存在一个js文件里。见BIRT英文论坛ht ...
-- by RogerTu -
请大家给我估价,上海地区 ...
chinata 写道 julycn 写道: 有两三家企业给了offer,(o ...
-- by vwpolo -
请大家给我估价,上海地区 ...
你太精通了,全被你研究透了,是的无价!
-- by soleghost






评论排行榜