hibernate细节2

关联映射:
一对一
一方
@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总是失效的,不会建立对应的字段或者表。 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值