有关hibernate一对一主键关联映射的问题

constrained="true" 和 这2个设置有什么区别啊, 不是已经表明他是共享主键吗,constrained="true" 也表明存在主键约束,那这2个区别是什么啊

5个回答

例如user与room表格,可以如下建立:

[code="sql"]CREATE TABLE user (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default ''
);

CREATE TABLE room (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
address VARCHAR(100) NOT NULL default ''
);[/code]

User类别与Room类别的设计使用 一对一(唯一外键关联) 中的设计即可,接着在User.hbm.xml方面如下设计:

User.hbm.xml
[code="xml"]<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> [/code]

在Room.hbm.xml的设计方面如下:

Room.hbm.xml
[code="xml"]<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> user [/code][color=red]在Room的id主键上,使用foreign表示与外键共享主键,也就是与User实体共享主键,而constrained设定为true,表示约束room的主键必须与user中对应资料的主键相同。[/color]

一个储存的实例如下:

[code="java"]User user1 = new User();
user1.setName("bush");
Room room1 = new Room();
room1.setAddress("NTU-M8-419");

// 互相设定关联
user1.setRoom(room1);
room1.setUser(user1);

User user2 = new User();
user2.setName("caterpillar");
Room room2 = new Room();
room2.setAddress("NTU-M8-418");

// 互相设定关联
user2.setRoom(room2);
room2.setUser(user2);

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

session.save(user1);
session.save(user2);

tx.commit();
session.close();[/code]

主键关联

一对一的主键关联形式,即两张关联表通过主键形成一对一映射关系。

一个典型的主键关联实例:中国公民只允许拥有一份护照,这里我们把用户TUser和护照TPassport设定为基于主键关联的一对一关系:

在Hibernate中,通过one-to-one节点对一对一关系进行声明:

TUser.hbm.xml

   <class

          name=”com.redsaga.hibernate.db.entity.TUser”

          table=”T_USER”

   >

          <id name=”id” column=”id” type=”java.lang.Integer”>

          </id>

          <property name=”name” type=”java.lang.String” column=”name”/>

          <property name”age” type=”java.lang.Integer” column=”age”/>

          <one-to-one name=”passport”

                 class=”com.redsaga.hibernate.db.entity.TPassport”

                 cascade”all”

                 outer-join=”true”

          />

   </class>

在上面的配置中:

1.通过one-to-one节点,我们将TUser类与TPassport类相关联。大于one-to-one节点的具体配置请参见附录。

2.级联关系设置为all。

级联(cascade)在Hibernate映射关系中是个非常重要的概念。它指的是当主控方执行操作时,关联对象(被动方)是否同步执行同一操作。如对主控对象调用save-update或delete方法时,是否同时对关联对象(被动方)进行save-update或delete。

TPassport.hbm.xml

   <class

          name=”com.redsaga.hibernate.db.entity.TPassport”

          table=”T_PASSPORT”

   >

   <id name=”id” column=”id”>

          <generator class=”foreign”>

                 <param name=”property”>user</param>

          </generator>

   </id>



   <one-to-one

          name=”user”

          class=”com.redsaga.hibernate.db.entity.TUser”

          constrained=”true”

   />



   ...

由于采用了主键关联方式,那通过主键关联的两张表,其关联记录的主键值须保持同步。这也就意味着,我们只需为一张表设定主键生成器,而另一张表的主键与之共享相同的主键值。

在hibernate中,我们可以通过“foreign”类型的主键生成器与外键共享主键值。

同时,one-to-one节点的constrained属性必须设定为“true”,以告知Hibernate当前表主键止存在一个约束:“T_Passport表引用了T_User表的主键”。

测试代码:

TUser user=...

...

passport.setUser(user);

user.setPassport(passport);

Transaction tx=sexxion.beginTransaction();

session.save(user);

tx.commit();

惟一外键关联

在一个假定的权限管理系统中,线个用户都从属于一个用户组。如用户“Erica”从属于“System Admin”组。用户表T_User中包含一个group_id字段,此字段与T_Group的id字段相关联。这就是一个典型的“惟一外键关联”:

首先我们来看映射配置,如下:

   <class

          name=”com.redsaga.hibernate.db.entity.TUser”

          table=”T_USER”

   >



          <id name=”id” column=”id” type=”java.lang.Integer”>

                 <generator class=”native”/>

          </id>



          <property name=”name” type=”java.lang.String” column=”name”/>

          ...



          <many-to-one

                 name=”group”

                 class=”com.redsaga.hibernate.db.entity.TGroup”

                 column=”GROUP_ID”

                 unique=”true”

          />

   </class>

constrained="true" 创建表的时候你就会看见区别了。加了这个,就会给表加外键约束,前提是你的数据库引擎要支持外键约束。MySQL的MyISAM不支持。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐