constrained="true" 和 这2个设置有什么区别啊, 不是已经表明他是共享主键吗,constrained="true" 也表明存在主键约束,那这2个区别是什么啊
例如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]
这篇文章还不错
http://ajava.org/course/open/10671.html
主键关联
一对一的主键关联形式,即两张关联表通过主键形成一对一映射关系。
一个典型的主键关联实例:中国公民只允许拥有一份护照,这里我们把用户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>
详细请见
[url]http://caterpillar.onlyfun.net/Gossip/HibernateGossip/OneToOnePK.html[/url]
constrained="true" 创建表的时候你就会看见区别了。加了这个,就会给表加外键约束,前提是你的数据库引擎要支持外键约束。MySQL的MyISAM不支持。