关联映射:
一对一
一方
@OneToOne
@JoinColumn(name="wifeid")(不加也可以,会自动生成一个默认的名字) wifeid为丈夫表中对应妻子的id的列名
例如 单向:@OneToOne
@JoinColumn(name="wifeid")//对应数据库的列
public Wife getWife() {
return wife;
}
双向时:另一方
@OneToOne
//@JoinColumn
在Wife一端的husband加上注解,mappedBy
@OneToOne(mappedBy="wife")引用属性
//例1:加上mappedBy属性后就可以在wife这一端告知这个关联是在wife属性上设置的.就不用管理wife这一端生成的husband的设置.生成的wife表格不会有husband字段.
组件映射
对象关系:一个对象是另一个对象的一部分(尤其是一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表)
数据库表:是一张表
Annotation:@Embeddable(是在Wife的类前面添加的注解), @Embedded(在Husband的wife属性上建立注解) 两者选其一就OK
//@Embedded
public Wife getWife() {
return wife;
}
多对一(many to one)单向关联映射(例如一个部门group对应多个员工user)
@Entity
@Table(name="t_group")//注意表名与SQL中关键字重名
private Group group
只需要在多的一端User属性group进行注解配置
@ManyToOne
@JoinColumn(name=”groupId”)
XML配置
<many-to-one name="group" column="groupId" />
标签会在”多”的一端添加外键,相当于在数据库中添加外键
一对多单向外键关联映射(例如一个部门group对应多个员工user)
private User user
在一的这一端Group端users属性上进行注解配置
@OneToMany
@JoinColumn(name="groupId")(不可少的)
如果不指定生成的外键列@JoinColumn(name="groupId"),默认会生成多对多的关系,产生一张中间表.
一对多与多对一的双向关联是同一种情况.(因为多对一单向则增加一对多的单向,反之亦然)
关系模型(group一对多user)
Group(id,name,users)一
User(id,name,group)多
Set<User> users=new HashSet<User>()
配置规则:一般以多的一端为主,先配置多的一端
在多的一端User端配置group时
@ManyToOne
@JoinColumn(name="groupid")//加上User表中关联Group表的列名,不加会默认生成一个列
在一的一端Group端配置时,在users只需要加个mappedBy="group"
@OneToMany(mappedBy="group")
多对多单向关联
关系举例:老师学生,老师需要知道自己教了哪些学生,但学生不知道自己被哪些老师来教.
数据库:中间表
关系模型(Teacher多对多Student),从Teacher这一端能关联到students.
Student(id,name)多
Teacher(id,name,students)多
Set<Student> students=new HashSet<Student>()
在Teacher那一端配置
@ManyToMany
如果手动指定生成的中间表的表名和字段名
@JoinTable(
name="t_s", //表名
joinColumns={@JoinColumn(name="teacher_id")},//指向teacher表
inverseJoinColumns={@JoinColumn(name="student_id")}//指向另一张表
)
多对多双向关联
关系举例:老师学生,老师需要知道自己教了哪些学生,学生也知道自己有哪些老师.
数据库:中间表
Annotation:@ManyToMany
XML:<many-to-many>
多对多单向配置只需要在一端进行配置就可以了.
关系模型(Teache多对多Student)
Teacher(id,name,students)多
Student(id,name,teachers)多
Set<Student> students=new HashSet<Student>()
Set<Teacher> teachers = new HashSet<Teacher>();
Annotation配置
在Teacher这一端的students上配置
@ManyToMany
@JoinTable(name="t_s",
joinColumns={@JoinColumn(name="teacher_id")},
inverseJoinColumns={@JoinColumn(name="student_id")}
)
在Student一端的teachers只需要配置
@ManyToMany(mappedBy="students")
//意思是优先依据teacher来对表进行加载,比如a老师教q,w,e三个学生,b老师教,q,w两个学生,
那么e学生只被a老师所教,但是如果给e学生的teachers的set集合加上b老师,并不代表b老师就教e学生,
因为mappedBy对应的属性是指向teacher的,即mappedBy这方定义JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表。