首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.lang.ClassCastException: org.hibernate.mapping.SingleTableSubclass不能强制转换为org.hibernate.mapping.RootClass

java.lang.ClassCastException: org.hibernate.mapping.SingleTableSubclass不能强制转换为org.hibernate.mapping.RootClass
EN

Stack Overflow用户
提问于 2020-09-06 12:12:34
回答 1查看 425关注 0票数 1

我有两个类,一个父类和一个子类,我使用了this解决方案来定义混合继承策略,但是当使用maven编译时,我得到了一个错误。

父类:

代码语言:javascript
运行
复制
@Entity
@Table(name="ITEMS")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="ITEM_CATEGORY",discriminatorType=DiscriminatorType.INTEGER)
  public class Item {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name = "ITEM_ID")
  protected Long itemId;
.
.
.}

子类:

代码语言:javascript
运行
复制
 @Entity
    @SecondaryTable(name="TASKS", pkJoinColumns = 
    {@PrimaryKeyJoinColumn(name = "ITEM_ID", referencedColumnName = "ITEM_ID")})
    @DiscriminatorValue(value=ItemCategory.Values.TASK)
    public class Task extends Item {
        //no @Id field}

错误:

代码语言:javascript
运行
复制
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ClassCastException: org.hibernate.mapping.SingleTableSubclass cannot be cast to org.hibernate.mapping.RootClass
Caused by: java.lang.ClassCastException: org.hibernate.mapping.SingleTableSubclass cannot be cast to org.hibernate.mapping.RootClass

pom.xml:

代码语言:javascript
运行
复制
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

DDL:

代码语言:javascript
运行
复制
CREATE TABLE ITEMS(
ITEM_ID bigint auto_increment primary key,
.
.
.
FOREIGN KEY(RELATED_TO_ITEM) references ITEMS(ITEM_ID)
);


CREATE TABLE TASKS( #INCLUDES REPEATED TASKS, ONETIME TASKS, LEARNING DUTY AND RESPONSES
ITEM_ID bigint primary key,
.
.
.
FOREIGN KEY(ITEM_ID) references ITEMS(ITEM_ID)
);
EN

回答 1

Stack Overflow用户

发布于 2020-09-07 00:39:42

我试着在hibernate版本5.2.14.Final (spring-boot-starter-data-jpa 2.0.0.RELEASE)中使用你的映射(做了一些小改动):

表:

代码语言:javascript
运行
复制
CREATE TABLE ITEMS (
   ITEM_ID bigint auto_increment primary key,
   ITEM_CATEGORY bigint,
   RELATED_TO_ITEM bigint,
   FOREIGN KEY(RELATED_TO_ITEM) references ITEMS(ITEM_ID)
);

insert into ITEMS
values (1, 1, null), (2, 1, 1), (3, 0, 1), (4, 1, 2);

CREATE TABLE TASKS(
   ITEM_ID bigint primary key,
   code varchar(100),
   FOREIGN KEY(ITEM_ID) references ITEMS(ITEM_ID)
);

insert into TASKS
values (1, 'TASK 1'), (2, 'Task 2'), (4, 'Task 4');

Hibernate映射:

代码语言:javascript
运行
复制
@Entity
@Table(name = "ITEMS")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="ITEM_CATEGORY", discriminatorType = DiscriminatorType.INTEGER)
public class Item
{
   private Long itemId;

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "ITEM_ID")
   public Long getItemId()
   {
      return itemId;
   }
   public void setItemId(Long itemId)
   {
      this.itemId = itemId;
   }
}

@Entity
@SecondaryTable(name="TASKS", pkJoinColumns = {
   @PrimaryKeyJoinColumn(name = "ITEM_ID", referencedColumnName = "ITEM_ID")
})
@DiscriminatorValue("1")
public class Task extends Item
{
   private String code;

   @Column(table = "TASKS", name = "code")
   public String getCode()
   {
      return code;
   }
   public void setCode(String code)
   {
      this.code = code;
   }
}

@Entity
@DiscriminatorValue("0")
public class Job extends Item
{

}

和用于选择测试的简单代码:

代码语言:javascript
运行
复制
List<Item> items = session.createQuery("select i from Item i", Item.class).getResultList();

将生成以下sql:

代码语言:javascript
运行
复制
/* select i from Item i */
select
  item0_.ITEM_ID as ITEM_ID2_0_,
  item0_1_.code as code1_1_,
  item0_.ITEM_CATEGORY as ITEM_CAT1_0_ 
from DB_A.ITEMS item0_ 
left outer join DB_A.TASKS item0_1_ on item0_.ITEM_ID=item0_1_.ITEM_ID

和插入测试:

代码语言:javascript
运行
复制
Task task = new Task();
task.setCode("my new task 1");
session.persist(task);

将生成以下sql:

代码语言:javascript
运行
复制
 /* insert com.sternkn.hibernate.model.Task */
insert into DB_A.ITEMS(ITEM_CATEGORY)  
values (1)

/* insert com.sternkn.hibernate.model.Task */
insert into DB_A.TASKS(code, ITEM_ID) 
values (?, ?)

如果没有帮助,请提供异常的完整堆栈跟踪和继承层次结构中所有实体的完整代码

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63760632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档