Hibernate学习(一)--Hibernate知识要点4

多对多双向关联

关系举例:老师ßà学生,老师需要知道自己教了哪些学生,学生也知道自己有哪些老师.

数据库:中间表

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的默认的FetchTypeManyToOneEAGER,OneToMany上默认的是LAZY.

如果指定OneToOnefetch=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, StudentTeacher继承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, StudentTeacher继承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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值