关于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>();
相关推荐
现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的...
NULL 博文链接:https://cdxs2.iteye.com/blog/1934884
Hibernate Annotation几种关联映射 一对一(One-To-One) 使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键...
孤独的狼-------------hibernate_annotation 注解实现Hibernate映射
2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4.3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5. 映射实体Bean的关联关系 2.2.5.1. 一对一(One-to-one) 2.2.5.2. 多对一(Many-to-...
hibernate 关系注解:Hibernate Annotation关系映射
逐渐的Hibernate Annotation的映射方式也越来越盛行,相信过不了多久有可能会取代*.hbm.xml映射方式
现在已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*....
NULL 博文链接:https://cdxs2.iteye.com/blog/1932569
12.4.10 组成关系映射的annotation注解实现547 12.4.11 继承关系映射的annotation注解实现549 12.4.12 hibernate集合映射的annotation注解实现552 12.5 基于annotation的ssh 2整合开发554 12.6 小结563
NULL 博文链接:https://cdxs2.iteye.com/blog/1934707
hibernate的中关系映射分为一对一、一对多、多对一、多对多,其中有单双向之分。而一对一还有主键和外键区分。一共是九种。分别用xml配置文件和annotation实现。annotation的版本没有写测试程序,见谅。
借助新的 Hibernate Annotation 库,即可一次性地分配所有旧映射文件——一切都会按照您的想法来定义——注释直接嵌入到您的Java 类中,并提供一种强大及灵活的方法来声明持久性映射。 即利用hibernate注解后,可...
Hibernate一对多、一对一、多对多映射之Annotation篇
2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4.3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5. 映射实体Bean的关联关系 2.2.5.1. 一对一(One-to-one) 2.2.5.2. 多对一...
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用...
Hibernate 的注解学习 ExportDBAnnotation HibernateAnnotationUtils 【一对一】关系映射【一对多】关系映射 【多对多】关系映射 【composite复合主键】关系映射【component组件】关系映射
第9课 Hibernate的重点学习:Hibernate的对象关系映射 12 一、对象---关系映射模式 12 二、常用的O/R映射框架: 13 第10课 模拟Hibernate原理(OR模拟) 13 一、 项目名称 13 二、 原代码 13 第11课 Hibernate基础配置...