Hibernate 一对一主键单向关联
2017-02-08 17:41
441 查看
[align=left]Hibernate 一对一主键单向关联[/align]
[align=left] [/align] |
[align=left]1-1的关联可以基于主键关联,但基于主键关联的持久化类不能拥有自己的主键生成策略,它的主键由关联类负责生成。另外,另外,增加one-to-one元素来关联属性,必须为one-to-one元素增加constrained="true"属性,表明该类主键由关联类生成。[/align] |
[align=left] [/align] |
[align=left]一、模型介绍[/align] |
[align=left] [/align] |
[align=left]一个人(Person)对应一个地址(Address)。[/align] |
[align=left] [/align] |
[align=left]二、实体(省略getter、setter方法)[/align] |
[align=left] [/align] |
[align=left]public class Person11pk {[/align] |
[align=left] private int personid;[/align] |
[align=left] private String name;[/align] |
[align=left] private int age;[/align] |
[align=left] private Address11pk address11pk;[/align] |
[align=left] [/align] |
[align=left]public class Address11pk {[/align] |
[align=left] private int addressid;[/align] |
[align=left] private String addressdetail;[/align] |
[align=left] [/align] |
[align=left]三、表模型[/align] |
[align=left] [/align] |
[align=left]mysql> desc address_11pk;[/align] |
[align=left]+---------------+--------------+------+-----+---------+----------------+[/align] |
[align=left]| Field | Type | Null | Key | Default | Extra |[/align] |
[align=left]+---------------+--------------+------+-----+---------+----------------+[/align] |
[align=left]| addressid | int(11) | NO | PRI | NULL | auto_increment |[/align] |
[align=left]| addressdetail | varchar(255) | YES | | NULL | |[/align] |
[align=left]+---------------+--------------+------+-----+---------+----------------+[/align] |
[align=left] [/align] |
[align=left]mysql> desc person_11pk;[/align] |
[align=left]+----------+--------------+------+-----+---------+-------+[/align] |
[align=left]| Field | Type | Null | Key | Default | Extra |[/align] |
[align=left]+----------+--------------+------+-----+---------+-------+[/align] |
[align=left]| personid | int(11) | NO | PRI | | |[/align] |
[align=left]| name | varchar(255) | YES | | NULL | |[/align] |
[align=left]| age | int(11) | YES | | NULL | |[/align] |
[align=left]+----------+--------------+------+-----+---------+-------+[/align] |
[align=left] [/align] |
[align=left]四、生成的SQL脚本[/align] |
[align=left] [/align] |
[align=left]/* Formatted on 2007/08/22 14:40 (QP5 v5.50) */[/align] |
[align=left]CREATE TABLE `address_11pk` ([/align] |
[align=left] `addressid` int(11) NOT NULL auto_increment,[/align] |
[align=left] `addressdetail` varchar(255) default NULL,[/align] |
[align=left] PRIMARY KEY (`addressid`)[/align] |
[align=left]) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;[/align] |
[align=left] [/align] |
[align=left] [/align] |
[align=left]/* Formatted on 2007/08/22 14:41 (QP5 v5.50) */[/align] |
[align=left]CREATE TABLE `person_11pk` ([/align] |
[align=left] `presonid` int(11) NOT NULL,[/align] |
[align=left] `name` varchar(255) default NULL,[/align] |
[align=left] `age` int(11) default NULL,[/align] |
[align=left] PRIMARY KEY (`presonid`),[/align] |
[align=left] KEY `FK68A882C591BB393E` (`presonid`),[/align] |
[align=left] CONSTRAINT `FK68A882C591BB393E` FOREIGN KEY (`presonid`) REFERENCES `address_11pk` (`addressid`)[/align] |
[align=left]) ENGINE=InnoDB DEFAULT CHARSET=gbk;[/align] |
[align=left] [/align] |
[align=left] [/align] |
[align=left]五、映射方法:在Person中配置id生成策略为:[/align] |
[align=left] [/align] |
[align=left] <id name="personid">[/align] |
[align=left] <!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->[/align] |
[align=left] <generator class="foreign">[/align] |
[align=left] <!--关联持久化类的属性名-->[/align] |
[align=left] <param name="property">address11pk</param>[/align] |
[align=left] </generator>[/align] |
[align=left] </id>[/align] |
[align=left] ......[/align] |
[align=left] <!--用于映射1-1关联-->[/align] |
[align=left] <one-to-one name="address11pk" constrained="true"/>[/align] |
[align=left] [/align] |
[align=left]<hibernate-mapping>[/align] |
[align=left] <class name="com.lavasoft.dx._1_1_pk.Person11pk" table="PERSON_11pk">[/align] |
[align=left] <id name="personid" column="presonid">[/align] |
[align=left] <!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->[/align] |
[align=left] <generator class="foreign">[/align] |
[align=left] <!--关联持久化类的属性名-->[/align] |
[align=left] <param name="property">address11pk</param>[/align] |
[align=left] </generator>[/align] |
[align=left] </id>[/align] |
[align=left] <property name="name"/>[/align] |
[align=left] <property name="age"/>[/align] |
[align=left] <!--用于映射1-1关联-->[/align] |
[align=left] <one-to-one name="address11pk" constrained="true"/>[/align] |
[align=left] </class>[/align] |
[align=left]</hibernate-mapping>[/align] |
[align=left] [/align] |
[align=left]<hibernate-mapping>[/align] |
[align=left] <class name="com.lavasoft.dx._1_1_pk.Address11pk" table="ADDRESS_11pk">[/align] |
[align=left] <id name="addressid">[/align] |
[align=left] <generator class="identity"/>[/align] |
[align=left] </id>[/align] |
[align=left] <property name="addressdetail"/>[/align] |
[align=left] </class>[/align] |
[align=left]</hibernate-mapping>[/align] |
[align=left] [/align] |
[align=left] [/align] |
[align=left]六、测试方法[/align] |
[align=left] [/align] |
[align=left]public class Test_11pk {[/align] |
[align=left] public static void main(String[] args){[/align] |
[align=left] Person11pk p1=new Person11pk();[/align] |
[align=left] [/align] |
[align=left] p1.setAge(21);[/align] |
[align=left] p1.setName("p1");[/align] |
[align=left] [/align] |
[align=left] Address11pk add1=new Address11pk();[/align] |
[align=left] add1.setAddressdetail("郑州市经三路");[/align] |
[align=left] [/align] |
[align=left] p1.setAddress11pk(add1);[/align] |
[align=left] [/align] |
[align=left] Session session= HibernateUtil.getCurrentSession();[/align] |
[align=left] Transaction tx=session.beginTransaction();[/align] |
[align=left] session.save(add1);[/align] |
[align=left] session.save(p1);[/align] |
[align=left] tx.commit();[/align] |
[align=left] HibernateUtil.closeSession();[/align] |
[align=left] }[/align] |
[align=left]}[/align] |
[align=left] [/align] |
[align=left] [/align] |
[align=left]七、测试结果[/align] |
[align=left] [/align] |
[align=left]1) :正常保存. 推荐这么干![/align] |
[align=left] session.save(add1);[/align] |
[align=left] session.save(p1);[/align] |
[align=left] [/align] |
[align=left]Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)[/align] |
[align=left]Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)[/align] |
[align=left] [/align] |
[align=left]2) :正常保存.[/align] |
[align=left] session.save(p1);[/align] |
[align=left] session.save(add1);[/align] |
[align=left] [/align] |
[align=left]Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)[/align] |
[align=left]Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)[/align] |
[align=left]Hibernate: update PERSON_11fk set name=?, age=?, addressId=? where personid=?[/align] |
[align=left] [/align] |
[align=left]3) :正常保存.[/align] |
[align=left]// session.save(p1);[/align] |
[align=left] session.save(add1);[/align] |
[align=left] [/align] |
[align=left]Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)[/align] |
[align=left] [/align] |
[align=left]4) : 发生异常,不能保存.[/align] |
[align=left] session.save(p1);[/align] |
[align=left]// session.save(add1);[/align] |
[align=left] [/align] |
[align=left]Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)[/align] |
[align=left]Exception in thread "main" org.hibernate.TransientObjectException: com.lavasoft.dx._1_1_fk.Address11fk[/align] |
相关文章推荐
- 数组(二):ArrayList的实现和Arrays类的使用
- 机器学习-数据归一化方法
- spring cloud
- Azure Blob存储更改缓存时间
- maven clean package 时出现Failed to read artifact descriptor for的问题解决
- 某人在企业中遇到的Spark问题记录[持续更新]
- 修改hdfs上目录的权限
- valgrind的使用
- 浅谈多线程之锁的机制
- 修改CM管理主机IP
- 修改CM管理主机IP
- 修改CM管理主机IP
- 修改CM管理主机IP
- 修改CM管理主机IP
- 修改CM管理主机IP
- 修改CM管理主机IP
- 修改CM管理主机IP
- 修改CM管理主机IP
- 修改CM管理主机IP
- Redis发布与订阅的参数