多对多双向关联
关系举例:老师ßà学生,老师需要知道自己教了哪些学生,学生也知道自己有哪些老师.
数据库:中间表
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=newHashSet<Teacher>();
Annotation配置
在Teacher这一端的students上配置
@ManyToMany
@JoinTable(name="t_s",
joinColumns={@JoinColumn(name="teacher_id")},
inverseJoinColumns={@JoinColumn(name="student_id")}
)
在Student一端的teachers只需要配置
@ManyToMany(mappedBy="students")
XML配置方式:两端配置一样,注意表名和生成的中间表的字段属性名要一致
Teacher那一端配置
<setname="students"table="t_s">
<keycolumn="teacher_id"/>
<many-to-manyclass="com.xxx.Student"column="student_id"/>
</set>
在Student那一端配置
<setname="teachers"table="t_s">
<keycolumn="student_id"></key>
<many-to-manyclass="com.xxx.Teacher"column="teacher_id"/>
</set>
生成的数据库表和上面是一样的.
树状结构的设计(重要)
设计思想:数据库模型,面向对象模式,关系映射,CRUD
数据库模型:表(id,name,pid)
实体模型:父结点ß一对多à子结点,一对多/多对一双向关联映射,一个子结点只有一个父结点,一个父结点有多个子结点.
Class Org
privateintid;
privateStringname;
privateSet<Org>children=newHashSet<Org>();
privateOrgparent;
关系映射:在同一个类中使用@ManyToOne和@OneToMany
在父结点parent上
@ManyToOne
@JoinColumn(name="parent_id")
publicOrg getParent() {
returnparent;
}
在子结点children上
@OneToMany(cascade=CascadeType.ALL, mappedBy="parent")
publicSet<Org> getChildren() {
returnchildren;
}
基本关联关系对象的CRUD
1想删除或者更新,先做load,除非精确知道ID.
2 Cascade属性(是一个数组)管理CUD,只是为了编程的方便,不要把它的功能看得太大.
cascade={CascadeType.ALL}
CascadeType取值
ALL Cascade all operations所有情况
MERGE Cascade merge operation合并(merge=save+update)
PERSIST Cascade persist operation存储persist()
REFRESH Cascade refresh operation刷新
REMOVE Cascade remove operation删除
规律,双向关系要是程序中设定双向关联.还要设置mappedBy
3 Fetch属性,读取,管理R(Retrieve查询)
fetch = FetchType.LAZY|EAGER
Hibernate Annotation的默认的FetchType在ManyToOne是EAGER的,在OneToMany上默认的是LAZY.
如果指定OneToOne的fetch=FetchType.LAZY,会延迟对关联对象的加载,不管是load还是get.
在XML中,在外键属性上设置inverse=”true|false”进行设置.
4如果想消除关联关系,先设定关系为NULL就可以打破关联关系,再删除对应记录.如果不删除相关的记录,该记录就成为垃圾数据.
5O/R Mapping编程模型
A映射模型(映射数据库)
1 JPA ANNOTATION
2 hibernate annotation extension
3 hibernate xml
4 jpa xml
B编程接口(增删改查)
1 jpa
2 hibernate
C数据库查询语言
1 HQL
2 EJBQL (JPQL)
6
集合映射(不太重要)
Set
List
@OrderBy(“属性名ASC|DESC”)
Map
@MapKey(name=”字段名”)
private Map<Integer, User> users = new HashMap<Integer, User>();
继承映射(不太重要)
三种模式:TABLE_PER_CLASS| JOINED| SINGLE_TABLE
strategy=InheritanceType.XXX
关系模式就是一种方式,在数据库的表有三种表现形式.
SINGLE_TABLE模式
Person, Student和Teacher继承Person
Person(id,name)
Student(score)
Teacher(title)
在Student实体中
@Entity
@DiscriminatorValue("student")
在Teacher中
@Entity
@DiscriminatorValue("teacher")
在Person中
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminator",discriminatorType=
DiscriminatorType.STRING)
@DiscriminatorValue("person")
生成的表为
create table Person (
discriminator varchar(31) not null,
id integer not null auto_increment,
name varchar(255),
score integer,
title varchar(255),
primary key (id)
)
TABLE_PER_CLASS模式
这种方式也比较麻烦,注意id生成策略.
Person, Student和Teacher继承Person
Person(id,name)
Student(score)
Teacher(title)
在Person中
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@TableGenerator(//ID生成策略采用表生成策略
name="t_gen",
table="t_gen_table",
pkColumnName="t_pk",
valueColumnName="t_value",
pkColumnValue="person_pk",
initialValue=1,
allocationSize=1
)
主键映射
@Id
@GeneratedValue(generator="t_gen", strategy=GenerationType.TABLE)