在hibernate内如何配置一对一的关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在hibernate内如何配置一对一的关系相关的知识,希望对你有一定的参考价值。

请问在在hibernate内如何配置一对一的关系
假如:数据表A中的一个数据和数据表B的数据有一对一的关系!!
数据表A的主键是B的外键,请问在配置两张表的时候如何配置这种一对一的关系.
请告诉我配置代码!
谢谢了!!
我想知道在A和B表分别是怎么配的!!!
请问三楼,B表的外键(对A表主键的引用)配置在那一句的??
是这句吗?<generator class="foreign">
<param name="property">A</param>
</generator>

  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(丈夫):
  <one-to-one name="myWife" class="...WifePo" cascade="all"→级联操作></one-to-one>
  实体B(妻子):
  <id ...>
  <generator class="foreign"→表示这个表的主键依赖于另一张表的主键(主键约束)
  <para name="property">myMan</para>
  </generator>
  </id>
  <one-to-one name="myMan" class="...Hasband"></one-to=one>
  另外,我发现如果在使用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配置,这种情况可以看做多对一的一种特例;
  对公民实体:
  <many-to-one name="CitizenPo" class="..." cascade="all"→这里是必须得,因为另一张表依赖于这张表,没有这条会报错。unique="true"→唯一的 column=""/>
  对于身份证而言:
  <one-to-one name="citizen" class="" property-ref="card"→表明这是通过外键加载
  cascade="all" →这句不写 在存身份证表的时候公民表不会更新/>
参考技术A 看来你要做的是一对一的主键关联。像一楼那样做就差不多了。
比如A表:

<class name="A" table="aa">
<id name=id column="id"
type="java.lang.Integer">
<generator class="native">
</id>

<one-to-one name="B"
class="B"
cascade="all"
outer-join="true"/>
</class>

B表:
<class name="B" table="bb">
<id name=id column="id">
<generator class="foreign">
<param name=property>A</param>
</generator>
</id>

<one-to-one name="A"
class="A"
constrainted="true"/>

</class>

name这里面的东西只是一个关系名,是一个标识,一个引用名,就像SPRING的XML文件里BEAN的名字一样,不一定就是表名。
cascade="all"是表示级联关系设置为all。
outer-join是什么意思应该一目了然,不用说了吧。

下面的constrained是一个约束,这里就表示告知HIBERNATE当前表主键上存在一个约束:“B表引用了A表的主键”。

"请问三楼,B表的外键(对A表主键的引用)配置在那一句的??
是这句吗?<generator class="foreign">
<param name="property">A</param>
</generator>"可以这么说,HIBERNATE通过"foreign"类型的主键生成器与外键共享主键值。

上面的配置是采用了主键关联方式关联两张表,其关联记录的主键值保持同步。说白了就是只需对A表生成主键,B表的主键与之共享主键值。本回答被提问者和网友采纳
参考技术B 这几天刚好看到这个例子,感觉写的不错。你可以参考一下。
http://bbs.w3china.org/blog/more.asp?name=lhwork&id=21523
参考技术C <class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<one-to-one name="person"
property-ref="address"/>
</class>􀀣􀁭􀀿􀀿 􀃌􀀢􀀟􀀓􀀕􀀢􀂃 􀃦􀀡􀂃 􀁮

以上是关于在hibernate内如何配置一对一的关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate框架学习之注解配置关系映射

Hibernate学习笔记

Hibernate学习笔记

Hibernate关联关系配置(一对多一对一和多对多)

Hibernate多表关系配置——一对一关系映射

hibernate 关联关系(多对多对多一对一)的配置