【问题标题】:Hibernate InheritanceType.JOINED prevents table creationHibernate InheritanceType.JOINED 阻止创建表
【发布时间】:2020-03-28 12:32:21
【问题描述】:

我有两个类,“OrderBase”和“OrderPay”,我正在尝试实现“InheritanceType.JOINED”类型的继承。

虽然 TABLE_PER_CLASS 和 SINGLE_TABLE 工作正常,但一旦我将类型更改为“JOINED”,就无法创建它,我不知道为什么。

我在切换继承类型时删除并重新创建了架构,以确保这不是问题。

我尝试为其实现该类型继承的任何其他类也会发生这种情况。

我的建表策略是“create”: spring.jpa.hibernate.ddl-auto=创建

将其更改为“更新”时,即使该表存在于数据库中(抛出错误之前和之后),错误仍然会持续存在。

我还创建了一个新项目,以确保没有其他任何东西阻止它运行,并且仍然会发生相同的错误。

我在 github 上分享了这个项目。在 localhost 上使用 mysql 创建模式的规范在 application.properties 文件中: https://github.com/Danielmethner/brownbag

这里是类:

  1. OrderBase.java
package com.brownbag_api.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "ORDER_BASE")
@Inheritance(strategy = InheritanceType.JOINED)
public class OrderBase implements Serializable {

    private static final long serialVersionUID = -3458221490393509305L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @NotNull
    @Column(name = "AMOUNT")
    private double amount;

    public Order() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }
}
  1. OrderPay.java
package com.brownbag_api.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.validation.constraints.NotNull;

@Entity
public class OrderPay extends OrderBase  {

    private static final long serialVersionUID = 4643589803146964779L;

    @NotNull
    @Column(name = "BOOK_TEXT")
    private String bookText;

    public OrderPay() {
    }

    public String getBookText() {
        return bookText;
    }

    public void setBookText(String bookText) {
        this.bookText = bookText;
    }
}

堆栈跟踪如下(实际上归结为“找不到父类的表”)

原因:javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory;嵌套异常是 org.hibernate.MappingException:无法实例化持久化程序 org.hibernate.persister.entity.JoinedSubclassEntityPersister 引起:org.hibernate.MappingException:无法实例化持久化器 org.hibernate.persister.entity.JoinedSubclassEntityPersister 原因:org.hibernate.AssertionFailure: Table brownbag.order_base not found

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.brownbag</groupId>
    <artifactId>api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>api</name>
    <description>API for brownbag project</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <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-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

【问题讨论】:

  • OrderPay 是否继承自正确的类?不应该是OrderBase吗?
  • 这是帖子中的错字,在源代码中是正确的,因此错误仍然存​​在。

标签: java hibernate spring-boot jpa inheritance


【解决方案1】:

你有一个错字。可能你继承自 javax.persistence.criteria.Order。

如果您将 OrderPay 更改为从正确的 OrderBase 类扩展,那么一切都会按预期工作并创建表:

public class OrderPay extends OrderBase {

    //rest of code

}

另外,去掉这个属性:

spring.jpa.properties.hibernate.default_schema=brownbag

您已经在 spring.datasource.url 中定义了要连接的数据库。

【讨论】:

  • 对不起,错字只是在答案中,实际源代码是正确的,错误仍然存​​在
  • 您可以编辑您的问题,使其包含带有导入的真实代码吗?
  • 我添加了导入。但是,我尝试在该项目的任何其他类中实现这种类型的继承,但它不会在任何地方工作。
  • 您使用的是哪个版本的休眠(或 spring-data-jpa)?你能粘贴或粘贴 pom.xml 和 application.properties 吗?
  • 如果我理解正确的话,版本是管理的,基于 Spring Boot 版本 "2.2.6.RELEASE" 我还粘贴了一个与项目的 GitHub 链接。非常感谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多