前段时间做的一个项目里面,由于关联关系用到了下面的一种一对多的关联关系.
对象继承:
根对象Information
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "informationtype", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "INFORMATION")
public class Information implements Serializable{
protected Category category;
......
public void setItem(Item item) {
this.item = item;
}
public void setCategory(Category category) {
this.category = category;
}
}
子对象AttachInformation
@Entity
@DiscriminatorValue("ATTACHINFORMATION")
public class AttachInformation extends Information{
private long size;
......
}
子对象BasicInformation
@Entity
@DiscriminatorValue("BASICINFORMATION")
public class BasicInformation extends Information implements Serializable{
private String description;
}
这样,子对象分别对根对象的值作了扩展,并采用的是继承关系一个表的结构.这样,在表information表中,分别对AttachInformation增加一个size(类型为big int),description(类型为varchar)的字段.现在有一个类,它分别对AttachInformation和BasicInformation有一个一对多的关联.关联关系如下
@Entity
public class Category implements Serializable{
private List<BasicInformation> basicInformationList;
private List<AttachInformation> attachInformationList;
......
@OneToMany(mappedBy = "category",cascade = CascadeType.REMOVE)
public List<BasicInformation> getBasicInformationList() {
return basicInformationList;
}
@OneToMany(mappedBy = "category",cascade = CascadeType.REMOVE)
public List<AttachInformation> getAttachInformationList() {
return attachInformationList;
}
}
可以看出,对象Category,分别对应多个BasicInformation和多个AttachInformation.采用一对多双向的关联,二者对Category的引用都采用getCategory()的方式,并且其引用的外键都是category_id.
这种关联方式在大多数应用下都没有问题,但是在当从category引用其关联的attachInformation或者basicInformation时,问题出现了.特别在当删除category时,由于关联删除,将查询出其attachInformationList和basicInformationList并且一个一个地删除(这种方式是由于由多一方负责进行关联).
在删除过程中出现了一个异常信息,描述为:can not turn a null value into primary type.大概意思就是说无法将一个空信息转化成基本类型.查看了一个输出的sql语句,发现当删除category时,出现一个查询关联对象的语句,而语句竟然是from Information为主体的,再用spy追踪了一下,发现是hibernate用这个hql语句将information查询出来,再分别将这些对象转化为具体的子类型,结果当遇到size为null时(这时候的类型为basicInformation),错误就发生了.
查看详细的sql语句,发现sql中并没有将informationtype='attachInformation'这个鉴别器加上,导致查询出的对象并非是完全正确类型的对象.在google中找了半天,并没有发现相应的信息,最后在hibernate手册中找到一个关于在继承中使用 强制鉴别的一个annotation(ForceDiscriminator).将这个加到根类的type上,重装运行程序.现在删除成功了.出现的sql语句已经将鉴别器带上了.
关于forcediscriminator这个东西,讲得很少.在关键时候还是帮了大忙.:)
分享到:
相关推荐
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...
3. **多对一关联(Many-to-One)**:与一对多相反,多个实体可以关联到数据库表中的一个记录。在父类的一方定义外键字段。 4. **多对多关联(Many-to-Many)**:一个实体可以与数据库中的多个记录关联,反之亦然。...
**标题解析:**“hibernate多对多双向关联” 在Java编程中,Hibernate是一个流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。"多对多双向关联"是Hibernate中一种关系映射类型,涉及两...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...
在Java的持久化框架Hibernate中,一对多关联映射是一种常见的关系映射方式,它用于表示一个实体(如用户)可以拥有多个关联实体(如订单)。在这个场景中,"一"通常代表父实体,"多"代表子实体。这篇博客文章...
在Java的持久化框架Hibernate中,一对多关系是常见的实体关联类型,特别是在处理数据库中的表与表之间的关联时。在这个“Hibernate一对多双向自身关联demo代码”中,我们将深入理解如何实现一个实体类与其自身进行一...
“Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...
在Java的持久化框架Hibernate中,一对一(One-to-One)关系是对象之间的关联类型之一,它代表了两个实体之间存在唯一的对应关系。本篇将详细讲解如何使用Hibernate实现一对一唯一外键(Unique Foreign Key)关联映射...
在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联关系是一种常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联,反之亦然。本源码示例将深入探讨如何使用Hibernate来配置和管理这种复杂的...
标题 "Hibernate基于连接表的一对多单向关联" 涉及的是数据库对象关系映射(ORM)框架Hibernate中的一个重要概念。在Java开发中,Hibernate是广泛使用的工具,它允许开发者将Java类与数据库表进行映射,简化了数据...
在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...
【标题】:“Hibernate多对一关联demo” 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。本教程将详细解释如何在Hibernate中实现多对一的关联关系,以及如何通过一个实际的示例...
本实例将深入探讨Hibernate中的三种基本关联关系:一对一(One-to-One)、一对多(One-to-Many)以及多对多(Many-to-Many)的实现方式。 1. **一对一关联**: 一对一关联通常出现在两个实体之间存在唯一对应关系...
总结来说,“每个子类一张表”的继承映射策略是Hibernate提供的一种处理继承关系的方法,它将类的继承结构映射到数据库的多个表中。这种策略适合于子类具有大量特有属性的情况,但需要权衡可能带来的数据库设计复杂...
- **一对多(One-to-Many)映射**:一个实体可以关联多个其他实体,比如一个班级有多名学生。这通常通过`@OneToMany`注解实现,可以设置`mappedBy`属性来指定关联的另一端。 - **多对多(Many-to-Many)映射**:两...
本项目“Hibernate学习:单向多对一关联 工程”专注于讲解Hibernate中的单向多对一关联映射,这是数据库设计中常见的关系类型,尤其在处理具有层次结构的数据时。 单向多对一关联指的是在一个实体类中有一个引用,...