hibernate中实体关系表的配置,一对一关系:
在关系型数据库中存在两种表示一对一关系的设计方式,分别是“主键约束”和“唯一外键约束”。针对这两种不同的设计,在hibernate中有两种配置方法:
首先要明确,这两种设计的实体关系都可以表示为:你中有我,我中有你。也就是说对象关系是一样的
①主键约束
这种设计方式,是A表和B表都有一个相同的主键
比如夫妻关系表,如下:
class Hasband{
private int id;
private String name;
private Wife myWife;
getter和setter
}
以及
class Wife{
private int id;
private String name;
private Hasband myMan;
getter和setter
}
注意设计表的时候,一定要有一个主键
对应的表结构如下:
table t_hasband
t_id int
t_name varchar
以及
table t_wife
t_id int
t_name varchar
在hibernate中的配置则要注意两点,第一:两张表一定要建立级联操作,第二:其中一张表的主键必须有一个class=“foreign”,关键配置如下:
实体A(丈夫):
实体B(妻子):
另外,我发现如果在使用MySQL时,在hibernate中设置主键自增时,设成native将会报错,最好使用increment。
②唯一外键约束(注意唯一两字)
对象关系不变
表的建立不一样了,我们用公民与身份证的例子来说明,给公民一个唯一的表示身份证id的标识,,因为是唯一标识,所以建在那张表上没有区别
表结构是:
t_citizen
t_id int primary key
t_name String
t_carId int
以及
t_card
t_id int primary key
t_name string
至于hibernate配置,这种情况可以看做多对一的一种特例;
对公民实体:
对于身份证而言:
看来你要做的是一对一的主键关联。像一楼那样做就差不多了。
比如A表:
cascade="all"
outer-join="true"/>
B表:
A
constrainted="true"/>
name这里面的东西只是一个关系名,是一个标识,一个引用名,就像SPRING的XML文件里BEAN的名字一样,不一定就是表名。
cascade="all"是表示级联关系设置为all。
outer-join是什么意思应该一目了然,不用说了吧。
下面的constrained是一个约束,这里就表示告知HIBERNATE当前表主键上存在一个约束:“B表引用了A表的主键”。
"请问三楼,B表的外键(对A表主键的引用)配置在那一句的??
是这句吗?
A
上面的配置是采用了主键关联方式关联两张表,其关联记录的主键值保持同步。说白了就是只需对A表生成主键,B表的主键与之共享主键值。
这几天刚好看到这个例子,感觉写的不错。你可以参考一下。
http://bbs.w3china.org/blog/more.asp?name=lhwork&id=21523