关系映射

这里的关系是指对象之间的关系,不是数据库之间的关系。

简化问题:

a)怎么写Annotation

b)增删改查CRUD怎么写。

三种关系(一对一,一对多,多对多)如果在程序里就有(单向,多向)七种。

常用的主键关联的单向的外建关联。

一对一的单向外建关联:

a)如果在类里面new另一个对象,则是类的单向引用 。多对多,一对一都是多对多的特殊例子;下面一段代码在annotation:


@OneToOne

@JoinColumn(name = "wifeId")

public Wife getWife() {

    return wife;

}

需要关联的字段get方法上@OneToOne

在xml文件里怎么配置:

//不能按照字面理解。Uinque=”true”就变成了一对一的单向关联,column关联字段。

注意在建立关联的时候,每个表格的配置都正确,不然会出错,不提示

一对一的双向外建关联:

a)两个关联;

b)在@OneToOne(mappedBy=”wife”)相当于告诉hibernate它跟该对象是一个一对一的关联,告诉它在Wife已经在husband类的一个属性wife上做了映射了。

c)在xml里面参考文档;(hibernate文档)

i.<one-to-onename="stuidcard"property-ref="student"> property-ref设置由谁设置。

ii.

一对一的单向主键关联(不重要)

a)@OneToOne @PrimaryKeyJoinColumn,但是有bug,无法统一

b)Xml: ,可以设置主键约束:加上:constrained=”true”主键也要改成:student

双向的主键关联(不重要)

联合主键:

在设置主键关联的类的主键字段需要单独建立一个类,字段就是实体类需要主键关联的主键,wifePK.java。这个类不是实体类。不做任何操作

@IdClass(WifePK.class)//设置联合的类;包含联合的字段

WifePK需要实现serializable和重写equals和hashcode方法。

在每一个联合的属性上加@Id就可以了。(默认就可以了)

如果要更改字段名字,在联合主键里用JoinColumns


@JoinColumns(

(

@JoinColumn(name = “wifeId”,referencedColumnName=”id”)

//后者参考id字段。

@JoinColumn(name=”wifeName”,referencedColumnName=”name”)

//后者参考name字段。

)

只要有双向关联mappedBy必设(不应该在两边都插数据)。

当用powerDesigner连接mysql数据库的时候,必须把jdbc连接的jar包设置到系统的classpath里面。

组键映射

a)当安全是一对一的关系时候,可以放到一个表里面。

b)如果把Wife当Husband 一部分:

i.不需要@Entity,@Id也不需要了。在Husband的wifer的getWife上面加上@Embedded,将对象wife嵌入。

ii.运行时候就合并成了一张表格。

iii.两个类的属性不能冲突,当冲突的时候

a)组建重写。

b)改属性名字;

c)在映射的时候,改成其它名字@Column()

iv.可以通过两个对象访问。

v.在xml里设置:用标签把另一个类当成一部分嵌入表中。

多对一与一对多单向(重点)

a)多对一单向关联,

i.项目名称;

ii.多个User可以是一个Group

iii.在多那一方加外键。 Onetomany加在对应的get方法上……

iv.多对一的映射关联用在映射类的get方法上@ManyToOne,如果类名与表名不一样,用@Table(name=”tableName”)

v.Xml:<many-to-onename=”student”column=“studentid”>

一对多单向

a)一个Group可以有多个User

b)用Set user = new HashSet();再在get方法上@OneToMany,这样会当成多对多特殊情况来处理(不合适)。在@OneToMany下面需要@JoinColumn(name=”hb”)

c)Group.hbm.xml:

//指定关联的字段名;

        <one-to-many class=”bjxst.User”></one-to-many>

多对一与一对多双向

a)一对多双向与多对一双向关联一回事。

b)maooedBy=”group”

c)xml里://两个地方 的columnId必须一样。

多对多的单向关联(重点)

a)单向关联。

b)中间表

c)Student与Teacher之间就是多对多的关联。

d)两个类,做为Teahcer知道自己教多个Student,但做为Student不知道自己被多个Teacher教。所以Teacher里需要一个Set集合,在get方法上@ManyToMany,@JoinTable(name=”t_s”,//修改默认名字。也可以指定JoinColumns=@JoinColumn(name=”teacher_id”),

inverseJoinColumns=@JoinColumn(name=”student_id”)//逆转对方的那个表的id

)

在xml里配:在table指定中间表名。再<many-to-manyclass=”bjsxt.student”column=”student_id”>

多对多的双向关联(相当少用,相对是重点)

a) 两个类,做为Teahcer知道自己教多个Student,但做为Student也知道自己被多个Teacher教。

b) 两边都需要Set集合。上面@ManyToMany(mappedBy=”students”)

当有中间表的时候hibernate不会自己删除,要手动删

在测试时候,sf=new Configuration().configure().buildSessionFactory();不要随便加,会不报错异常。

原文地址:https://www.cnblogs.com/yuyu666/p/9795561.html