博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
07hibernate_one2one_ufk_1
阅读量:6225 次
发布时间:2019-06-21

本文共 4789 字,大约阅读时间需要 15 分钟。

hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)
一对唯一外键关联映射是多对一关联映射的特例:
public 
class Person {
    
private 
int id;
    
    
private String name;
    
    
private IdCard idCard; 
//
在多的一方加入一个外键,数据库中增加一个字锻
-------------------------------------------------------------------------    
<hibernate-mapping>
    <
class name="com.bjsxt.hibernate.Person" table="t_person">
        <id name="id">
            <generator 
class="native"/>
        </id>
        <property name="name"/>
        <many-to-one name="idCard" unique="true"/>
    </
class>
</hibernate-mapping>
    
-------------------------------------------------------------------------
可以采用<many-to-one>标签,指定多的一端的unique=
true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联
-------------------------------------------------------------------------
导出表语句:
create table t_idcard (id integer not 
null auto_increment, cardNo varchar(255), primary key (id))
create table t_person (id integer not 
null auto_increment, name varchar(255), idCard integer unique, primary key (id))
alter table t_person add index FK785BED80539D4B66 (idCard), add constraint FK785BED80539D4B66 foreign key (idCard) references t_idcard (id)
-------------------------------------------------------------------------
mysql> use 07hibernate_one2one_ufk_1;
Database changed
mysql> desc t_person;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | 
int(11)      | NO   | PRI | NULL    | auto_increment |
| name   | varchar(255) | YES  |     | NULL    |                |
| idCard | 
int(11)      | YES  | 
UNI | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> desc t_idcard;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | 
int(11)      | NO   | PRI | NULL    | auto_increment |
| cardNo | varchar(255) | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
TestSave1:由于没有设置cascade="all",或者你只保存了多方,没有保存一方,则会抛出异常信息:org.hibernate.TransientObjectException
org.hibernate.TransientObjectException: object references an unsaved 
transient instance - save the 
transient instance before flushing: com.bjsxt.hibernate.IdCard
TestSave1:
Hibernate: insert into t_idcard (cardNo) values (?)
Hibernate: insert into t_person (name, idCard) values (?, ?)
mysql> select *  FROM t_person;
+----+------+--------+
| id | name | idCard |
+----+------+--------+
|  2 | 菜10 |      1 |
+----+------+--------+
1 row in set (0.00 sec)
mysql> select *  FROM t_idcard;
+----+----------------+
| id | cardNo         |
+----+----------------+
|  1 | 88888888888888 |
+----+----------------+
1 row in set (0.00 sec)
TestLoad:
Hibernate: select person0_.id as id1_0_, person0_.name as name1_0_, person0_.idCard as idCard1_0_ from t_person person0_ where person0_.id=?
person.name=菜10
Hibernate: select idcard0_.id as id0_0_, idcard0_.cardNo as cardNo0_0_ from t_idcard idcard0_ where idcard0_.id=?
idCard.cardNo=88888888888888
------------------------------------------------------
package com.bjsxt.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
public 
class One2OneTest 
extends TestCase {
    
public 
void testSave1() {
        Session session = 
null;
        
try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            
            IdCard idCard = 
new IdCard();
            idCard.setCardNo("88888888888888");
            
            Person person = 
new Person();
            person.setName("猪八戒");
            person.setIdCard(idCard);
            
            
//
不能成功保存,因为IdCard是Transient状态
            session.save(person);
            
            session.getTransaction().commit();
        }
catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally {
            HibernateUtils.closeSession(session);
        }
    }        
    
    
public 
void testSave2() {
        Session session = 
null;
        
try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            
            IdCard idCard = 
new IdCard();
            idCard.setCardNo("88888888888888");
           //先保存一方,再保存多方,OK! 
          
  session.save(idCard);
            
            Person person = 
new Person();
            person.setName("菜10");
            person.setIdCard(idCard);
            
            
session.save(person);
            
            session.getTransaction().commit();
        }
catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally {
            HibernateUtils.closeSession(session);
        }
    }            
    
public 
void testLoad1() {
        Session session = 
null;
        
try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
             //由于 testSave1()抛出异常,所以数据库中的记录
id=2 
            Person person = (Person)session.load(Person.
class,
 2);
            System.out.println("person.name=" + person.getName());
            System.out.println("idCard.cardNo=" + person.getIdCard().getCardNo());
            session.getTransaction().commit();
        }
catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally {
            HibernateUtils.closeSession(session);
        }
    }        
    
}

转载于:https://www.cnblogs.com/alamps/archive/2012/08/02/2619985.html

你可能感兴趣的文章
创建扑克测试(二)
查看>>
LNMP+Discuz论坛
查看>>
关机和虚拟机克隆、快照
查看>>
oracle12C 重做日志
查看>>
rsync+shell脚本完成自动化备份
查看>>
Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
查看>>
Excel 2010同时打开多个独立的窗口
查看>>
Watchguard-X505e-mobile***配置终结篇
查看>>
我的友情链接
查看>>
centos6.5安装mysql5.6.23报错
查看>>
sz/rz工具包,linux下没有sz和rz命令
查看>>
tomcat项目进入不了debug模式
查看>>
我抽中了管理员bobo的祝福
查看>>
8款非常棒的响应式 jQuery 幻灯片插件推荐
查看>>
Web前端开发人员和设计师必读文章【系列十一】
查看>>
saltstack 数据系统——Grains
查看>>
springmvc 集成和使用 hibernate-validator
查看>>
Apache和Tomcat利用Proxy代理保持Session
查看>>
LVM(Logical Volume Manager)逻辑卷管理 - 简介、历史、术语、安装、命令、实例、故障排除...
查看>>
多选按钮(CheckBox)——Mars Android开发视频教程之第一季第九集(重)
查看>>