两个pojo,Baby 和Baby File
对应数据库中表baby和babyfile.两个表有外键关联,且babyfile的外键不能为空
配置了个单向一对多,级联关系为save-update
/**
*
* @author weip
* @time 2006-5-10 16:23:19
* @return Set
*
* @hibernate.set lazy="true" cascade="save-update"
* @hibernate.collection-key column="babyId"
* @hibernate.collection-one-to-many class="com.mofile.baby.domain.BabyFile"
*/
public Set getFileSet() {
return fileSet;
}
在修改session中的baby中babyfile,然后提交,结果报错:
。。。。。。。。。。。。
Hibernate: insert into babyfile (sequence, type) values (?, ?)
(JDBCExceptionReporter.java:49) - could not insert: [com.mofile.baby.domain.BabyFile]
java.sql.SQLException: Cannot add or update a child row: a foreign key constraint fails (`baby/babyfile`, CONSTRAINT `babyfile_fk` FOREIGN KEY (`babyid`) REFERENCES `baby` (`id`))
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2847)
原来在插入新的babyfile的时候,没有外键信息,所以违反了外键约束,实际上就是插入空外键出错。
不得已只能在BabyFile加入babyid,做了如下配置就好了
/**
*
* @author weip
* @time 13:56:23 2006-5-14
* @return int
* @hibernate.property not-null="true" column="babyid" size="5"
*/
public int getBabyid() {
return babyid;
}
当然也可以使用getBaby(),考虑到性能方面,所以没有这样作
修改之后的hibernate操作如下:
Hibernate: insert into babyfile (sequence, type, babyid) values (?, ?, ?)
Hibernate: update babyfile set babyId=? where id=?
第二句很多余,推测应该inverse="true",
于是改配置在一对多的关系中加上inverse="true",
修改之后的hibernate操作如下:
Hibernate: insert into babyfile (sequence, type, babyid) values (?, ?, ?)
没有了第二句
结论:
看来有非空外键约束且有save-update或者all-delete-orphanh或者all级联的一对多关系(delete级联没试过不知道如何),必须配置双向关联,且最好inverse="true"
分享到:
相关推荐
例如,在一对多关系中,如果我们向父实体的集合属性添加了一个新对象,那么在调用`save()`或`persist()`方法时,这个新对象也会被持久化。 2. 级联删除(Cascade Type.REMOVE) 当设置为`CascadeType.REMOVE`时,...
在这个" Hibernate级联操作一对多demo "中,我们将探讨如何在一对多的关系中应用级联操作。 一对多关系是数据库中常见的关系类型,它表示一个实体(如部门)可以有多个相关实体(如员工)。在Hibernate中,这种关系...
- **一对多**:可以在`Address`类中使用`@OneToMany`映射多个用户,但通常情况下,为了保持数据一致性,我们会选择在`User`类中定义多对一的关系,并在`Address`类中不显式地表示这种关系。 ### 总结 通过上述介绍...
在Java持久化框架Hibernate中,一对多(One-to-Many)、多对一(Many-to-One)、级联(Cascading)、加载(Loading)和反转(Inversing)是关系映射的重要概念,它们对于理解如何在数据库和对象之间有效地管理关联至...
在Hibernate 3.2版本中,级联关系是处理对象间关联的重要特性,特别是自身一对多双向关联,这允许一个实体类实例与多个相同类型的其他实例相关联,而且这种关联是双向的。现在,让我们深入探讨这个主题。 首先,...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性。下面将详细阐述这两个概念以及如何在实际应用中使用它们。 一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动...
本项目“hibernate3.2的级联关系_JavaProject”旨在帮助初学者理解并实践Hibernate 3.2中的级联关系,包括一对多、一对一和多对多这三种主要的关系类型。 首先,让我们深入了解一下级联关系。级联关系在Hibernate中...
8. **注意事项**:级联查询在多对多关联时需要特别注意,因为可能会导致数据冗余或者一致性问题。 以上是对“Hibernate级联查询”这一主题的详细说明,涵盖了相关概念、配置、使用示例以及可能的源码解析。由于没有...
在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门课程,而一门课程也可以被多名学生选修。在Hibernate中,这种关系通过中间关联表(也称为连接表或联合表)来实现,该...
本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...
总结,掌握Hibernate HQL级联查询的关键在于理解数据库模型、Java对象和映射文件之间的关系,以及如何在HQL中正确表达这些关系,从而实现高效的数据库操作。在实际开发中,应合理利用级联查询的优势,同时注意其可能...
本实例将深入探讨Hibernate中的三种基本关联关系:一对一(One-to-One)、一对多(One-to-Many)以及多对多(Many-to-Many)的实现方式。 1. **一对一关联**: 一对一关联通常出现在两个实体之间存在唯一对应关系...
- **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系模型构建**:在数据库层面构建一对多的关系模型。 - **...
在Hibernate中,处理一对多关系主要使用`@OneToMany`和`@ManyToOne`注解。一个简单的例子通常包括两个实体类:一个“父”类和一个“子”类。在一对多关系中,“父”实体包含对多个“子”实体的引用,而每个“子”...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为...通过适当配置和使用Session、Transaction以及HQL,我们可以有效地管理和维护一对多、多对一等关联关系中的数据。
在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...
对于一对多的关系,如果希望在删除A对象时,同时删除所有相关的AA对象,可以在A.hbm.xml的`<set>`元素中设置`cascade="all-delete-orphan"`。这表示不仅在A被删除时删除所有AA,而且当AA对象被孤儿化(不再与任何A...
在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...
本篇文章将详细讲解"hibernate一对多与多对一"的关系映射概念,以及如何在实际开发中进行配置和使用。 首先,我们来看一下“一对多”关系。在现实世界中,这种关系可以对应到例如一个班级有多个学生,或者一个人...