[align=center][size=medium]Hibernate 一对一外键单向关联[/size][/align]

基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。只需要将原来的many-to-one元素增加unique="true"属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。

[b]一、模型介绍[/b]

一个人(Person)对应一个地址(Address)。

[b]二、表模型[/b]
以下是基于MySQL表的创建的SQL脚本
address表:

CREATE TABLE `address` (  `addressid` int(11) NOT NULL auto_increment,  `address` varchar(255) default NULL,  PRIMARY KEY  (`addressid`)) ENGINE=InnoDB DEFAULT CHARSET=gbk;

person表:

CREATE TABLE `person` (  `personid` int(11) NOT NULL auto_increment,  `name` varchar(255) default NULL,  `addressId` int(11) default NULL,  PRIMARY KEY  (`personid`),  CONSTRAINT FOREIGN KEY (`addressId`) REFERENCES `address` (`addressid`)) ENGINE=InnoDB DEFAULT CHARSET=gbk;

[b]三、实体[/b]
创建持久化类:(省略getter、setter方法)

package com.hibernate.oneone; public class Person {    private int personid; private String name;  private Address address;}

public class Address { private int addressid;    private String address;}

下一步,我们把这个持久化类的信息告诉Hibernate。

[b]四、映射文件:(省略dtd声明)[/b]
Address.hbm.xml

<hibernate-mapping>    <class name="com.hibernate.oneone.Address" table="ADDRESS">        <id name="addressid">            <generator class="identity"/>        </id>        <property name="address"/>    </class></hibernate-mapping>

Person.hbm.xml

<hibernate-mapping>    <class name="com.hibernate.oneone.Person" table="PERSON">        <id name="personid">            <generator class="identity"/>        </id>        <property name="name"/>        <!--用来映射关联PO column是Address在该表中的外键列名,增加unique变成“1-1”-->        <many-to-one name="address" column="addressId" unique="true"/>    </class></hibernate-mapping>

然后进行Hibernate的主要配置。

[b]五、Hibernate配置[/b]
根据映射文件,进行hibernate配置,在hibernate.cfg.xml里添加如下代码,具体的JDBC配置有在Hibernate创建第一个应用程序中具体描述过。

<mapping resource="com/hibernate/oneone/Address.hbm.xml"/><mapping resource="com/hibernate/oneone/Person.hbm.xml"/>

[b]六、启动和辅助类 [/b]
加载和储存一些对象,首先启动Hibernate,此过程包括创建一个全局的SessoinFactory,并把它储存在应用程序代码容易访问的地方。SessionFactory可以创建并打开新的Session。一个Session代表一个单线程的单元操作,SessionFactory则是个线程安全的全局对象,只需要被实例化一次。

我们将创建一个HibernateUtil辅助类(helper class)来负责启动Hibernate和更方便地操作SessionFactory。让我们来看一下它的实现:

public class HibernateUtil { private static final SessionFactory sessionFactory;

    static {        try {            // Create the SessionFactory from hibernate.cfg.xml            sessionFactory = new Configuration().configure().buildSessionFactory();        } catch (Throwable ex) {            System.err.println("Initial SessionFactory creation failed." + ex);            throw new ExceptionInInitializerError(ex);        }    }    public static SessionFactory getSessionFactory() {        return sessionFactory;    }}

[b]七、测试方法[/b]
我们可以使用Hibernate来加载和存储对象了,编写一个带有main()方法的Test_Person_Address类:

public class Test_Person_Address {   public static void main(String[] args) {      Person person = new Person();        person.setName("测试者");

        Address address = new Address();     address.setAddress("杭州市延安路");

     person.setAddress(address);

     Session session = HibernateUtil.getSessionFactory().getCurrentSession();     Transaction tx = session.beginTransaction();     session.save(person);     session.save(address);        tx.commit();      HibernateUtil.getSessionFactory().close();    }}

[b]八、测试结果[/b]

1.session.save(address);  session.save(person);

  Hibernate: insert into ADDRESS (address) values (?)  Hibernate: insert into PERSON (name, addressId) values (?, ?)

2.session.save(person);  session.save(address);

  Hibernate: insert into PERSON (name, addressId) values (?, ?)  Hibernate: insert into ADDRESS (address) values (?)  Hibernate: update PERSON set name=?, addressId=? where personid=?

3.session.save(address);  //session.save(person);

  Hibernate: insert into ADDRESS (address) values (?)

4.//session.save(address);  session.save(person);

  Hibernate: insert into PERSON (name, addressId) values (?, ?)  Exception in thread "main" org.hibernate.TransientObjectException: com.hibernate.oneone.Address

Hibernate 一对一外键单向关联相关推荐

  1. hibernate一对一外键单向关联

    与上篇相对应,还是client和address是一对一的外键关联关系,address表中的主键ID与client表中的外键CLIENTADDRESSID构成一对一外键关联关系. 表结构和sql语句就不 ...

  2. Hibernate一对一主键单向关联

    2019独角兽企业重金招聘Python工程师标准>>> 模型user,address address对user进行外键关联,意思就是address的主键是由user的主键关联生成的, ...

  3. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联...

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  4. hibernate一对一主键关联映射(一)---单向关联

    1.新建工程项目hibernate_one2one_pk_1,添加hibernate所需Jar包和mysql驱动Jar包. 2.建立工具类HihernateUtils.java和ExportDB.ja ...

  5. Java hibernate假外键_浅谈hibernate急迫加载问题(多重外键关联)

    数据库结构如下 strategy中有外键member_id(关联member表)外键strategy_category(关联category表)而member表中有外键position_id(关联po ...

  6. 取消hibernate的外键生成

    取消hibernate的外键生成 @ForeignKey(name="null")  /** *方法: 取得TablePropertyEntity *@return: TableP ...

  7. mysql一对一外键约束_MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表...

    我们在同一数据库创建的表时候,很多时候会出现相同数据的冗余问题,也就是说几个id会有一个或者同n个相同字段,这样就导致数据表结构数据重复冗余, 冗余还无所谓,关键是如果我要改其中一个相同的字段信息,其 ...

  8. python自关联_Django之Mode的外键自关联和引用未定义的Model方法

    Django Model的外键自关联 在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上级部门(sup ...

  9. Django之Mode的外键自关联和引用未定义的Model

    Django Model的外键自关联 在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上级部门(sup ...

最新文章

  1. 在WinForm应用程序中嵌入WPF控件(转)
  2. 『C#基础』调用CMD的一个小工具
  3. Web实时通信,SignalR真香,不用愁了
  4. 嵌入式开发过程中结构体字节对齐问题pragma pack(1)
  5. SQL基础E-R图画法(一)
  6. 拓端tecdat|R语言实现有限混合模型建模分析
  7. system_Class类说明文档
  8. js+html空间数据编码问题--以姓名为例(代码设涉及文件读取,文本数字提取,特别是文本x,y坐标的提取)
  9. 高通设备进入高通9008模式
  10. 使用Access-Control-Allow-Origin解决跨域
  11. 7-10 抢楼层 (20分) ---注意歧义啊!
  12. Intel处理器家族及命名规则
  13. web test LoadRunner docs / loadrunner license、cd-key、download
  14. J版 OpenStack动态加载菜单图片详解
  15. RFC 2132 的 DHCP Options
  16. C++11并发与多线程笔记(10) future其他成员函数、shared_future、atomic
  17. 自写小小工具解密FeiQ消息
  18. android 学习 路线图
  19. 《ZigBee开发笔记》第五部分 外设篇 - 协议栈实验 第6章 CC2530光敏和热敏传感器
  20. java 日志打印sql语句_利用log4j打印sql的log日志

热门文章

  1. 操作系统之进程管理:15、哲学家进餐问题
  2. Sysmon勘验、分析现场(主机监控)
  3. 查看Linux内核版本、系统版本命令
  4. win32diskimager报错:An error occured when attempting to XXX, Error 5: Access is Denied
  5. day 05总结(格式化输出的三种方式/基本运算符/if判断)
  6. Java转型(向上转型和向下转型)
  7. Sharepoint 2010 根据用户权限隐藏Ribbon菜单
  8. java的property配置文件的用法
  9. 登陆SQL Server 2008时提示评估期已过的解决办法
  10. STM32的CAN过滤器详解