Hibernate之对象关系映射01一对一单向关联

2024-08-30 00:08

本文主要是介绍Hibernate之对象关系映射01一对一单向关联,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

hibernate映射关系有一对一、一对多、多对一、多对多;其中每一种又分单向和双向,主键和外键。需要配置实体类、实体类的映射文件,对应为数据库表间的关系;此篇先讲非注解方式的。

单向一对一:即在一个对象中存在另一个对象的引用,而在另一个对象中则不存在该对象的引用。

参考熔岩文章:http://lavasoft.blog.51cto.com/62575/39312

实体类文件

Person11tab.java

private int personId;
private String personName;
private int age;
private Address11tab address11tab;

Address11tab.java

private int addressId;
private String detailAddress;

表结构

-- 一对一单向关联的中间表
DROP TABLE IF EXISTS join_11tab;
CREATE TABLE join_11tab (person_id int(11) PRIMARY KEY,address_id int(11) UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 一对一单向关联人员表
DROP TABLE IF EXISTS person_11tab;
CREATE TABLE person_11tab (person_id int(11) PRIMARY KEY auto_increment,person_name varchar(20),age int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 一对一单向关联家庭住址表
DROP TABLE IF EXISTS address_11tab;
CREATE TABLE address_11tab (address_id int(11) PRIMARY KEY auto_increment,detail_address varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 为 一对一单向关联的中间表 增加外键
ALTER TABLE join_11tab ADD CONSTRAINT fk_join_11tab_person FOREIGN KEY(person_id) REFERENCES person_11tab(person_id);
ALTER TABLE join_11tab ADD CONSTRAINT fk_join_11tab_address FOREIGN KEY(address_id) REFERENCES address_11tab(address_id);-- SELECT * FROM person_11tab;
-- SELECT * FROM address_11tab;
-- SELECT * FROM join_11tab;

配置文件

Person11tab.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.ack.hibernateMapping.entity.Person11tab" table="person_11tab"><id name="personId" column="person_id"><generator class="identity"/></id><property name="personName" column="person_name"/><property name="age"/><!--使用join元素显式确定连接表--><join table="join_11tab"><key column="person_id"/><!--其中unique=“true”属性,将多对一确定为“1-1”--><many-to-one name="address11tab" column="address_id" unique="true"/></join></class>
</hibernate-mapping>

Address11tab.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.ack.hibernateMapping.entity.Address11tab" table="address_11tab"><id name="addressId" column="address_id"><generator class="identity"/></id><property name="detailAddress" column="detail_address"/></class>
</hibernate-mapping>

别忘了在hibernate.cfg.xml中加入类的映射文件引用。

测试类,HibernateUtil参考可前面的文章

public class Test_pa_11tab {public static void main(String[] args) {Person11tab p1 = new Person11tab();p1.setPersonName("陈三");Address11tab add1 = new Address11tab();add1.setDetailAddress("丽水市莲都区");p1.setAddress11tab(add1);Session session = HibernateUtil.getCurrentSession();session.beginTransaction();session.save(p1);session.save(add1);session.getTransaction().commit();}
}

p1在add1前保存,sql语句如下:

insert into person_11tab(person_name, age) values(?, ?)
insert into join_11tab(address_id, person_id) values(?, ?)
insert into address_11tab(detail_address)  values(?)
update join_11tab set address_id=? where person_id=?

add1在p1前保存,sql语句如下:

insert into address_11tab(detail_address)  values(?)
insert into person_11tab(person_name, age) values(?, ?)
insert into join_11tab(address_id, person_id) values(?, ?)

只有add1保存,sql语句如下:

insert into address_11tab(detail_address)  values(?)

只有p1保存,sql语句如下:

insert into person_11tab(person_name, age) values(?, ?)
insert into join_11tab(address_id, person_id) values(?, ?)

报异常:org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.ack.hibernate.hibernateMapping.entity.Address11tab.

因为需要根据p1的Person11tab对象获取Address11tab的add1去update join_11tab表,在p1中找不到对应的add1。

这篇关于Hibernate之对象关系映射01一对一单向关联的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119243

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3