用户登录
用户注册

分享至

hibernate1对1

  • 作者: 正宗卖男孩的小火柴
  • 来源: 51数据库
  • 2020-10-02

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" →这句不写 在存身份证表的时候公民表不会更新/>


软件
前端设计
程序设计
Java相关