唯一外键
通过一个外键将两个表关联到一起。
下面以用户和用户组为例进行说明,一个用户对应一个用户组,用户表通过一个group_id与用户组进行关联。
TUser.java
映射文件TUser.hbm.xml
TGroup.java
映射文件TGroup.hbm.xml
用户表:
+-----------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | NO | UNI | | |
| password | varchar(50) | NO | | | |
| age | int(11) | YES | | NULL | |
| group_id | int(11) | YES | | NULL | |
+------------+---------------+------+-----+---------+----------------+
用户组表:
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | YES | | NULL | |
+-------+--------------+------+------+---------+----------------+
测试代码:
这时向用户表和用户组表中插入的数据是
用户表:
+----+-------+----------+------+----------+
| id | name | password | age | group_id |
+----+-------+----------+------+----------+
| 2 | tyqqw | liuhello | 12 | 1 |
+----+-------+----------+------+----------+
用户组表:
+----+------+
| id | name |
+----+------+
| 1 | haha |
+----+------+
从group_id与用户组id相同可以看出,他们通过group_id将两张表关联到了一起。
查询测试:
输出:tyqqw
由于我们在表的设计时是双向关联的我们同样可以通过用户查询到用户组。
下面以用户和用户组为例进行说明,一个用户对应一个用户组,用户表通过一个group_id与用户组进行关联。
TUser.java
java 代码
- package com.tyq.vo;
- public class TUser {
- private int id;
- private String name;
- private String password;
- private int age;
- private TGroup group;
- public int getId() {
- return id;
- }
- private void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public TGroup getGroup() {
- return group;
- }
- public void setGroup(TGroup tgroup) {
- this.group = tgroup;
- }
- }
java 代码
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.tyq.vo">
- <class name="TUser" table="tuser">
- <id name="id" column="id">
- <generator class="native" />
- </id>
- <property name="name" column="name" type="string"
- not-null="true" />
- <property name="password" column="password" type="string"
- not-null="true" />
- <property name="age" column="age" type="integer" />
- <many-to-one name="group" class="TGroup" column="group_id" unique="true"/>
- </class>
- </hibernate-mapping>
java 代码
- package com.tyq.vo;
- public class TGroup {
- private int id;
- private String name;
- private TUser user;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public TUser getUser() {
- return user;
- }
- public void setUser(TUser user) {
- this.user = user;
- }
- }
java 代码
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.tyq.vo">
- <class name="TGroup" table="tgroup">
- <id name="id" column="id">
- <generator class="native" />
- </id>
- <property name="name" column="name" type="string"
- not-null="true" />
- <one-to-one name="user" class="TUser" property-ref="group"/>
- </class>
- </hibernate-mapping>
+-----------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | NO | UNI | | |
| password | varchar(50) | NO | | | |
| age | int(11) | YES | | NULL | |
| group_id | int(11) | YES | | NULL | |
+------------+---------------+------+-----+---------+----------------+
用户组表:
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | YES | | NULL | |
+-------+--------------+------+------+---------+----------------+
测试代码:
java 代码
- TUser tuser = new TUser();
- tuser.setAge(12);
- tuser.setName("tyqqw");
- tuser.setPassword("liuhello");
- TGroup group = new TGroup();
- group.setName("haha");
- tuser.setGroup(group);
- UserDAOImpl dao = (UserDAOImpl)userDAO;
- Session session = dao.getSessionFactory().openSession();
- Transaction tx = session.beginTransaction();
- session.saveOrUpdate(tuser);
- session.saveOrUpdate(group);
- tx.commit();
- session.close();
这时向用户表和用户组表中插入的数据是
用户表:
+----+-------+----------+------+----------+
| id | name | password | age | group_id |
+----+-------+----------+------+----------+
| 2 | tyqqw | liuhello | 12 | 1 |
+----+-------+----------+------+----------+
用户组表:
+----+------+
| id | name |
+----+------+
| 1 | haha |
+----+------+
从group_id与用户组id相同可以看出,他们通过group_id将两张表关联到了一起。
查询测试:
java 代码
- TUser tuser = new TUser();
- UserDAOImpl dao = (UserDAOImpl)userDAO;
- Session session = dao.getSessionFactory().openSession();
- TGroup tgroup= (TGroup) session.load(TGroup.class,1);
- if(tgroup.getUser() != null){
- System.err.println(tgroup.getUser().getName());
- }
- session.close();
由于我们在表的设计时是双向关联的我们同样可以通过用户查询到用户组。