hibernate 级联映射

这几天因为自己搭的数据库结构用到很多外键约束,想到之前用mybatis的时候,可以用关联映射直接通过外键获取对象,就取百度查了下,发现hibernate也是有级联映射的,相对于mybatis,个人感觉hibernate的级联映射更加健全,但使用起来问题也比较多,要配置的东西也比较多;

可以分为,双向映射和单向映射,双向映射暂时没有用到,有时间再看下怎么使用,

单向映射比较简单,分为一对多、多对一、一对一以及多对多

只用到 一对多、多对一和多对多;三个的配置大同小异;主要的参数为

1、fetch:可选值为FetchType.EAGER 和FetchType.LAZY,默认为后者,使用前者时,当你查询主表时,会一起把这张表查询出来,同时,可能是单向映射的关系或者是没配置好,发现跟mybaits一样,如果关联出来的这个实体中也有配置关联映射,他会继续查询下去,感觉这样子对资源的浪费太大了,如果有大牛看到并且有空的希望能教我下,这个也是我困扰好久的问题···

当使用FetchType.KAZT时,只有当使用到该属性时才会从数据库中查询,但如果使用JSON将该实体转换为json对象时会报错,网上的方法是使用JsonConfig将关联的属性过滤掉,但一个是麻烦,一个是过滤掉就失去了关联的意义;暂时没发现满意的解决办法

关于json,在双向映射的时候会出现死循环的情况,也是使用JsonConfig来处理,如下:

JsonConfig jsonConfig = new JsonConfig();        
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
JSONArray json =JSONArray.fromObject(list.toArray(), jsonConfig);

2、cascade: CascadeType[]类型。该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,
     * 而且这种关系是递归调用的。举个例子:Order 和OrderItem有级联关系,那么删除Order 时将同时删除它所对应的OrderItem对象。
     * 而如果OrderItem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。cascade的值只能从CascadeType.PERSIST(级联新建)、
     * CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。
     * 还有一个选择是使用CascadeType.ALL,表示选择全部四项。 (网上前辈写的)

3  mappedBy: 定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,
     * 否则可能引起数据一致性的问题。

然后是生成外键列的几个

1->n|n->1:@JoinColumn(name="SECTION_ID",referencedColumnName="SECTION_ID",insertable=false,updatable=false ) 
n->n:@JoinTable(name="USER_POSITION", joinColumns={ @JoinColumn(name="USER_ID")}, inverseJoinColumns={ @JoinColumn(name = "PID") })

name为中间表,USER_ID是当前表在中间表中的外键,PID为所关键表在中间表中的外键


使用中,因为是使用powerDesigner生成外键和sql,所有约束中,外键和主键其实是同名的,这时要加上insertable=false,updatable=false;具体作用不太清楚,但不加会报错,如果属性名称不一样则不需要加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值