关系映射
一对一,一对多,多对一,多对多
1)怎么写Annotation
2)增删改查CRUD怎么写
一对一:单向(主键,外键),双向(主键,外键),中间表
一对多:单向,双向
多对一:单向,双向
多对多:单向,双向
集合映射,继承关系(不重要),组件映射
一对一:
如,husband,wife. A husband to A wife. 建立两个类,都有id,name两个属性
可在husband类中引用wife. 只是单向关系. 数据库有两张表,一个表是husband,一个表是wife
同样都是有id , name 两个字段 primary key(id).
设计方法有好多种.
1)主键关联.新增一个husband的时候,先看wife的id字段,有了,才可以创建
2)外键关联.在husband/wife表中加一个husband_id/wife_id
3)新增一个关系表.两个字段,一个是husband_id 参考husband表,另一个wife_id 参考wife表
a)一对一单向外键关联
1)Annotation
在husband类中有wife的引用
写@Entity @Id @GeneratedValue 在getWife前加@One2One
在wife类中
写@Entity @Id @GeneratedValue
@One2One 生成的表是,husband表中的外键默认为wife_id,要自己指定的话用
@JoinColumn(name="wifeid"),@JoinColumn可用在你自己建好了表,用这个来映射
2)xml
student - studentcard
在studentcard.hbm.xml中要写<many-to-one name="student" column="student_id" unique="true">
unique="true" 其实就是一对一
b)一对一双向外键关联
1)Annotation
husband类中有wife的引用.在wife类中也有husband的引用
方法同单向,不过需要在两个类中都加@One2One,不过这个方法生成的表有点奇怪
会变成两个表中都有一个外键,就是有两个外键关系
解决方法: 在wife类中,@One2One(mappedBy="wife"),告诉hibernate,在husband类中有wife的引用
已经由getWife属性映射了.这时只会有wife_id,而不会两边都有xxx_id
凡是双向,一定要设mappedBy
2)xml
方法同单向,但是要在student.hbm.xml写<one-to-one name="studentcard" property-ref="student">
property-ref指定的跟Annotation中的mappedBy作用一样
c)一对一单向主键关联 (不重要)
1)Annotation
同一对一单向外键关联,只不过@JoinColumn变成了@PrimaryKeyJoinColumn即可
不过貌似有bug.不知道有没有更新.
2)xml
在studentcard.hbm.xml加 <one-to-one name="student">,不过这样没有自动生成外键联系
加上constrainted="true",就会帮你自动生成外键约束,<generator class="foreign"> 不能用native了.
<generator class="foreign">
<param name ="property">student</param>
</generator>
d)一对一双向主键关联 (不重要)
1)Annotation
同双向. 只不过@JoinColumn变成了@PrimaryKeyJoinColumn,不用mappedBy
2)xml
同单向? -- 没听清楚~ 不过不重要. 需要的时候再查.
e)一对一 联合主键
wife(name,id,age),husband(name,id,age),wifepk(name,id)
不在husband中@OneToOne下设@JoinColumn了,要改名或映射的话,要用@JoinColumns
要这样写
@JoinColumns(
{
@JoinColumn(name="wifeId",referencedColumnName="id"),
@JoinColumn(name="wifeName",referencedColumnName="name")
}
)
Hibernate菜鸟学习笔记
最新推荐文章于 2017-11-02 23:02:36 发布