Hibernate 一对一外键单向关联
[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 一对一外键单向关联相关推荐
- hibernate一对一外键单向关联
与上篇相对应,还是client和address是一对一的外键关联关系,address表中的主键ID与client表中的外键CLIENTADDRESSID构成一对一外键关联关系. 表结构和sql语句就不 ...
- Hibernate一对一主键单向关联
2019独角兽企业重金招聘Python工程师标准>>> 模型user,address address对user进行外键关联,意思就是address的主键是由user的主键关联生成的, ...
- Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联...
2018-11-10 22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...
- hibernate一对一主键关联映射(一)---单向关联
1.新建工程项目hibernate_one2one_pk_1,添加hibernate所需Jar包和mysql驱动Jar包. 2.建立工具类HihernateUtils.java和ExportDB.ja ...
- Java hibernate假外键_浅谈hibernate急迫加载问题(多重外键关联)
数据库结构如下 strategy中有外键member_id(关联member表)外键strategy_category(关联category表)而member表中有外键position_id(关联po ...
- 取消hibernate的外键生成
取消hibernate的外键生成 @ForeignKey(name="null") /** *方法: 取得TablePropertyEntity *@return: TableP ...
- mysql一对一外键约束_MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表...
我们在同一数据库创建的表时候,很多时候会出现相同数据的冗余问题,也就是说几个id会有一个或者同n个相同字段,这样就导致数据表结构数据重复冗余, 冗余还无所谓,关键是如果我要改其中一个相同的字段信息,其 ...
- python自关联_Django之Mode的外键自关联和引用未定义的Model方法
Django Model的外键自关联 在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上级部门(sup ...
- Django之Mode的外键自关联和引用未定义的Model
Django Model的外键自关联 在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上级部门(sup ...
最新文章
- 在WinForm应用程序中嵌入WPF控件(转)
- 『C#基础』调用CMD的一个小工具
- Web实时通信,SignalR真香,不用愁了
- 嵌入式开发过程中结构体字节对齐问题pragma pack(1)
- SQL基础E-R图画法(一)
- 拓端tecdat|R语言实现有限混合模型建模分析
- system_Class类说明文档
- js+html空间数据编码问题--以姓名为例(代码设涉及文件读取,文本数字提取,特别是文本x,y坐标的提取)
- 高通设备进入高通9008模式
- 使用Access-Control-Allow-Origin解决跨域
- 7-10 抢楼层 (20分) ---注意歧义啊!
- Intel处理器家族及命名规则
- web test LoadRunner docs / loadrunner license、cd-key、download
- J版 OpenStack动态加载菜单图片详解
- RFC 2132 的 DHCP Options
- C++11并发与多线程笔记(10) future其他成员函数、shared_future、atomic
- 自写小小工具解密FeiQ消息
- android 学习 路线图
- 《ZigBee开发笔记》第五部分 外设篇 - 协议栈实验 第6章 CC2530光敏和热敏传感器
- java 日志打印sql语句_利用log4j打印sql的log日志
热门文章
- 操作系统之进程管理:15、哲学家进餐问题
- Sysmon勘验、分析现场(主机监控)
- 查看Linux内核版本、系统版本命令
- win32diskimager报错:An error occured when attempting to XXX, Error 5: Access is Denied
- day 05总结(格式化输出的三种方式/基本运算符/if判断)
- Java转型(向上转型和向下转型)
- Sharepoint 2010 根据用户权限隐藏Ribbon菜单
- java的property配置文件的用法
- 登陆SQL Server 2008时提示评估期已过的解决办法
- STM32的CAN过滤器详解