免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2206 | 回复: 0
打印 上一主题 下一主题

hibernate 关系映射 annotation 版 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-06 21:37 |只看该作者 |倒序浏览
hibernate 关系映射 annotation 版


关于mappedBy

双向关联是单向关联的扩展,只要一方写了配置(通常是 关联维护方即有外键的那方),另一方就可以通过 mappedBy 去找配置,不需要2边同时写.



关于@JoinColumn

@JoinColumn(name="外键名字段名" 可以用来指定外键,双向关联里的外键是不需要写 private 和 get / set 的.这个由hibernate自动维护.你表里设计了外键,但没用JoinColumn指定.hibernate会无视掉并以自己的命名方式想象一个外键,假如你数据库里的外键和这个想象外键对不上,报错.



也就是注意 @JoinColumn(name="外键名字段名"  注解写在哪里的问题.如果外键是自己的.@JoinColumn(name="外键名字段名"也写在自己这边,外键再写成成员变量就会报错.



怕漏写,总之外键的 private 和 get / set 是没报错就当成员变量写上.报错了去掉就是了.



关于 cascade 我大体是这么认为的.还有待验证.


注意这个是数组,所以 cascade={} .

先简单说明下,  A 类里有一个方法 getB() 用来获取 B 的对象

假如 getB() 方法上写了 cascade 注解,说明 A 的更删之类的操作会影响数据表内B的数据.

关联关系对这个没任何影响.总之就是A里获取B的方法上写上 cascade ,则 A 的操作就能影响数据库内具体的 B 数据.

多对多关系映射是通过中间表来维护关联,这个由hibernate自动维护中间表,不要写 cascade .



关于 fetch=FetchType.LAZY 我大体也是这么认为的.还有待验证.

先简单说明下,  A 类里有一个方法 getB() 用来获取 B 的对象

假如 getB() 方法上写了 fetch 注解,说明 A 类实体化后,除非使用 A.getB() 这个方法.否则不会立即从数据库里读取 B 的数据.

fetch=FetchType.EAGER 是默认值,就是立即读取.假如要立即读取B的数据.不写 fetch 就是了.
关联关系对这个没任何影响.




--------------------------------------------------------------------------------


一对一关联
@OneToOne

一对一的主键关联实在看不出意义何在.反倒是获取实例的时候可能多N多没用的数据,所以不深究了...至于外键关联,直接看下面的一对多,多对一.




--------------------------------------------------------------------------------



一对多,多对一关联

表字段说明

OneObject 表:

one_id 主键



ManyObject 表:

many_id 主键

one_id 外键,与OneObject 的主键关联





--------------------------------------------------------------------------------



单向一对多

OneObject:

@OneToMany
@JoinColumn(name="one_id"

private Set<ManyObject> mb = new HashSet<ManyObject>();



ManyObject:

private int one_id; //这个就是和 @JoinColumn(name="one_id"  对应的 one_id .


不需要注解.




--------------------------------------------------------------------------------



单向多对一

OneObject:

不需要注解.



ManyObject:

@ManyToOne
@JoinColumn(name="one_id"   //只需要在ManyObject指定外键为one_id.它就会去找 OneObject 的主键来对应.

private OneObject one;




--------------------------------------------------------------------------------



双向一对多,双向多对一

OneObject:

@OneToMany(mappedBy="one" //告诉hibernate关联去找 one .

private Set<ManyObject> mb = new HashSet<ManyObject>();



ManyObject:

@ManyToOne
@JoinColumn(name="one_id"  //注意,在这里指定外键名后,不要在 写 private int one_id; 和它的get / set 方法了.这个改由hibernate维护.写上是要报错的.

private OneObject one;  //这个对应的就是 @OneToMany(mappedBy="one" 的 one.




--------------------------------------------------------------------------------



多对多关联
表字段说明

ManyA 表:

a_id 主键



ManyB 表:

b_id 主键



A_B 表保存映射关系的中间表)

t_Aid 外键,与ManyA 的主键关联

t_Bid 外键,与ManyB 的主键关联




--------------------------------------------------------------------------------



单向多对多

ManyA:

@ManyToMany
@JoinTable(
            name="A_B", //中间表名
            joinColumns={@JoinColumn(name="t_Aid"}, //设置ManyA自己在中间表的对应外键
            inverseJoinColumns={@JoinColumn(name="t_Bid") //设置对方(ManyB)在中间表的对应外键
        }
)

private Set<ManyB> mb = new HashSet<ManyB>();



ManyB:

不需要注解.




--------------------------------------------------------------------------------



双向多对多

ManyA:

@ManyToMany
@JoinTable(
            name="A_B", //中间表名
            joinColumns={@JoinColumn(name="t_Aid")}, //设置ManyA自己在中间表的对应外键
            inverseJoinColumns={@JoinColumn(name="t_Bid") //设置对方(ManyB)在中间表的对应外键
        }
)

private Set<ManyB> mb = new HashSet<ManyB>();



ManyB:

@ManyToMany(mappedBy="mb") //告诉hibernate维护这个关联去找另一个对象的注解就可以了.不需要重复写.

private Set<ManyA> ma = new HashSet<ManyA>();



注:以上注释,ManyA的更删会影响到中间表A_B.但ManyB的更删不会影响到.假如2边都需要影响A_B表,则ManyB也写注解.注意 joinColumns 以及 inverseJoinColumns 的值对应不同.(其实就是两边都做成单向多对多)

ManyB:

@ManyToMany
@JoinTable(
            name="A_B",
            joinColumns={@JoinColumn(name="t_Bid")},
            inverseJoinColumns={@JoinColumn(name="t_Aid")
        }
)

private Set<ManyA> ma = new HashSet<ManyA>();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP