天天看点

【HIBERNATE框架开发之七】HIBERNATE使用ANNOTATION中各种关系映射的CRUD(增删改查)&&集合映射&&继承映射

      首先对于annotation中crud的c(create)操作:————————

假设 :   user (monytoone)       group

ok,那么有如下 junit code:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

configuration cfg = new annotationconfiguration();

sessionfactory sf = cfg.configure().buildsessionfactory();

session ss = sf.getcurrentsession();

group group = new group();

group.setname("group1");

user user = new user();

user.setname("user_himi");//备注1(在内存中建议关系)

user.setgroup(group);

ss.begintransaction();

//ss.save(group);//备注2

ss.save(user);

ss.gettransaction().commit();

sf.close();

备注1:如果想让两个在数据库中建立关联,那么在内存中就需要让其设置关联。

备注2:如果这里备注2行代码注视掉,是会报错的。因为hibernate默认情况不会自动保存关联变量到数据库中,不论是crud的任何操作,都默认不自动存储(不会产生集联)。

那么如果需要设置自动操作关联对象的话,可以使用cascade例如当前在@manytoone中设置:

@manytoone(cascade={

cascadetype.all

})

这里cascade中需要一个数组的参数,参数均为cascadetype,其中cascadetype的类型有如下几种:

cascadetype.all,//所有操作

cascadetype.merge,//合并

cascadetype.persist,//保存

cascadetype.refresh,//刷新

cascadetype.remove  //删除

总结:默认情况下有关联的对象,不论任何形式的关系映射,不论单向还是双向,在session进行持久化时都互不影响也不自动建立集联;如果需要自动建立集联关系到数据库中,那么在关系映射的注解上设置cascade!

另外一点:双向关系在程序中要设定双向的内存关联关系,并且双向需要设置mappedby!

要注意!使用cascadetype.all之外的类型,必须使用对应的函数方法才行!

    对于annotation中crud的r(read)操作:————————

1. 在cud操作时cascade才会有集联影响,但是杜宇r读取时使用fetch!

2.默认情况下在读取manytoone 取出任何一个many中的对象,那么对应的one会默认取出来;

默认情况下 在读取onetomany时取出one的时,默认many不会取出来;

如果需要手动设置可以使用fetch;

fetch有两个值:

1). eager  (立刻的)

2). lazy  (懒惰d的)

如果你想在onetomany时取出one的时候立刻取出所有其他many的,可以设置如下:

@onetomany(fetch=fetchtype.eager)  这样就会取出one的时候取出所有的many对象

备注:当你onetomany使用eager的时候,可以在sessionfactory关闭后仍然可以取many中的任意一个元素,但是如果manytoone并使用lazy的时候你在sessionfactory关闭后不可以取出one,因为是lazy默认不会帮你取出one!

注意:1)两方不要同事设置eager(会有多余的查询语句发出)

                     2) 对多方设fetch时要注意:一般用lazy ;

对于annotation中crud的u(update)操作:————————

简单;update不多说;

对于annotation中crud的d(delete)操作:————————

默认delete的时候,例如:manytoone,那么删除many中的一个元素时,那么hibernate会首先删除对应的元素,然后继续删除对应关联的one,那么发现表中(many)还有其他的元素,会先删除所有其他的many元素,最后删除one;

解决方案:

1)使用其他的cascade,不直接使用all类型;

2)打破关联关系。利用致null,将关联的one可以set为null,再删除对应记录即可;

3)使用hql语句删除

………………………….……..集合映射……….…………………..

一般使用如下集合:

set(hashset) 一般情况下使用;

list (arraylist) 一般需要排序的时候使用;

排序可以使用注解:@orderby(“name asc”)

map (hashmap)    需要注视  @mapkey(name=”id”)

………………………….……..继承映射……….…………………..

继承映射有三种形式:

1)使用一张表的形式  : single_table

2) 没各类分别一张表 table_per_class

3) 每个子类一张表  joined