hibernate中,对于table per class hierarchy(每个类一张表)的映射继承方式,可能会遇到的问题
若是这样3个标T_A、T_B、T_C,T_A是主表,T_B与T_C是2个子表;
这3个表分别对应3个类A、B、C
若T_A表存在一条主键是001的记录,且同时在T_B、T_C两张表中都存在一条主键是001的记录(若通过标准的UI操作不会出现这样的记录,一般都是在开发过程中,手动修改数据,而且数据库也认为这样数据是合理的),这是,我们若想主键为001的B对象的话,hibernate就会跑出下面异常
记住:以后遇到遮掩的异常,就你的两个子表中存在相同主键的记录,只要删除一条就可以了
org.hibernate.WrongClassException: Object with id: 001 was not of the specified subclass: B (loaded object was of wrong class)
at org.hibernate.loader.Loader.instanceAlreadyLoaded(Loader.java:1235)
at org.hibernate.loader.Loader.getRow(Loader.java:1186)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:569)
at org.hibernate.loader.Loader.doQuery(Loader.java:689)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1919)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:520)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1676)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:138)
.............
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:161)
.............
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
分享到:
相关推荐
在Java的持久化框架Hibernate中,"Table per Class Hierarchy"是一种继承映射策略,它在数据库层面将类继承关系转换为单一表的结构。这种策略适用于子类相对较少,且共享很多公共属性的情况,因为它避免了为每个子类...
在Java企业级开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中...
在本教程中,我们将深入探讨Hibernate中的继承映射策略,特别是"Table Per Class"策略,这是Java对象模型到关系数据库映射的一种方法。在Hibernate框架中,继承是通过ORM(对象关系映射)来实现的,它允许我们将复杂...
本教程以“Hibernate-lab2”为例,将深入探讨Hibernate中的继承映射,为初学者提供一个清晰的学习路径。 一、Hibernate继承映射概述 Hibernate继承映射是将Java中的继承关系映射到数据库的关系模型中。在Java中,...
Hibernate 支持多种数据持久化策略,其中包括了 `Table Per Class Hierarchy`,`Table Per Concrete Class` 和我们讨论的 `Table Per Subclass`。 **二、Table Per Subclass 策略** 在 `Table Per Subclass` 策略中...
3. 表格分层继承(Table per Class Hierarchy):只有一个表存储所有类的信息,表的每条记录代表一个实例,使用一个类型字段来区分不同类型的实例。这种策略适用于类的继承层次简单,且子类数量较少的情况。 在“hb...
在软件开发领域,尤其是在Java持久化技术中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转化为对Java对象的操作。本文将深入探讨Hibernate中的继承映射(Inheritance Mapping)...
2.2.4. 映射继承关系:Hibernate支持多种继承映射策略,如单一表继承(每个类一张表)、表-per-hierarchy(每个类层次结构一张表)、表-per-class(每个类一张表)和联合子类(连接的子类)。每种策略都有其适用场景...
9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用“每个类分层...
Hibernate 3.1.2是该框架的一个较早版本,但其核心概念和机制对于理解现代Hibernate版本仍然非常重要。 在Hibernate 3.1.2中文文档中,你可以找到以下关键知识点: 1. **对象关系映射(ORM)**:ORM是Hibernate的...
9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用“每个类分层...
这种策略是Hibernate提供的四种继承映射策略之一,其他还包括“表-per-hierarchy”,“表-per-concrete-class”和“joined-subclass”。 首先,让我们理解什么是继承映射。在面向对象编程中,类可以有继承关系,...
标题中的“17 继承(四)每一个具体的类 映射到一张表”指出,我们将关注的是类继承在Hibernate中的映射策略。在传统的面向对象编程中,继承允许我们创建一个新类(子类)并继承父类的属性和方法,以此实现代码复用和...
9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用“每个类分层...
Hibernate支持单表继承(Table per Class Hierarchy)、多表继承(Table per Concrete Class)和表分片(Table per Subclass)三种方式。 这些知识点涵盖了Hibernate的基本使用,通过分析压缩包中的图片资源,可以...
9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用“每个类分层结构...
在Hibernate中,为了在数据库中表示这种关系,它提供了多种策略,如“single-table”,“table-per-hierarchy”和“table-per-concrete-class”。而“union-subclass”策略是一种将继承树映射到多个表的方式,它允许...
在Hibernate中,当一个类继承体系映射到数据库时,有几种策略可以采用。其中一种是单表继承策略,即"整个继承树映射到一张表"。这种策略意味着所有子类的对象数据都将存储在同一个数据库表中,通过一个特定的字段来...
- **1.2.1 映射 Person 类**:通过映射一个具体的 `Person` 类来展示一对一、一对多等关联类型的实现。 - **1.2.2 单向 Set-based 的关联**:解释单向关联的使用场景及其在 Hibernate 中的具体实现。 - **1.2.3 使...
Hibernate 是Java开发中的一个持久化框架,它允许开发者用面向对象的方式处理数据库操作,将Java对象与数据库表进行映射,从而避免了传统的JDBC代码的繁琐。通过使用Hibernate,开发者可以专注于业务逻辑,而不是...