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
.多对一:
@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.一对一:
@OneToOne 注释,有五个属性:targetEntity、cascade、fetch、optional 和mappedBy, 前四个属性的具体含义与@ManyToOne 注释的同名属性一一对应,
fetch 属性默认值是FetchType.EAGER。mappedBy属性的具体含义与@OneToMany 注释的同名属性相同。
如果optional = true 设置表明此属性可以为null,例如在身份证的处理时可以这样设置,因为未成年人就是没有身份证的。
D.多对多:
@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)的外键关系。