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

相关文章

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s