【问题标题】:DiscriminatorColumn is not created in deep entity inheritance in JPADiscriminatorColumn 不是在 JPA 的深度实体继承中创建的
【发布时间】:2015-11-28 05:04:17
【问题描述】:

我想使用 jpa 创建一个深度继承实体。下面是我的实体的示例层次结构。

ProductEntity
- ElectronicsEntity
-- PhoneEntity
-- TabletEntity
-- CameraEntity
-- ComputerEntity
--- PCEntity
--- LaptopEntity
- AccessoriesEntity
-- CasingEntity
-- ScreenProtectorEntity

以下是我的几类实体的示例。

产品实体

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="type")
public abstract class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    String brand;
    private String name;
    private String image;
}

电子实体

@Entity
@DiscriminatorValue("Electronics")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="type")
public abstract class Electronics extends Product {
    private Date releasedDate;
}

电话实体

@Entity
@DiscriminatorValue("Phone")
public class Phone extends Electronics {
    private String os;
    private String cpu;
    private String gpu;
    private int ram;
    private double display;
    private double rearCamera;  
    private double frontCamera;
    private int battery;
    private double weight;
}

平板实体

@Entity
@DiscriminatorValue("Tablet")
public class Tablet extends Electronics {
    private String os;
    private String cpu;
    private String gpu;
    private int ram;
    private double display;
    private double rearCamera;  
    private double frontCamera;
    private int battery;
    private double weight;
}

问题是我的数据库没有正确创建。 ProductPhoneTablet 已正确创建,但 Electronics 未正确创建。 Electronics 表缺少 type 列,该列应该用于区分 PhoneTablet。如您所见,我已经在Electronics 中添加了@Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name="type"),所以type 列应该会自动添加,对吧?我在这里错过了什么?

【问题讨论】:

  • 您是否对实体进行了任何更改.. 就像您之前有一些东西,后来您添加了这个 type 列??
  • 以前我没有使用继承,但现在我正在尝试使用它。
  • 问题可能是 Hibernate 不能添加一个新的非空列,而鉴别器是一个非空列。你可以在列具有 def 值的电子类中尝试一次以下代码.. @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, columnDefinition = "varchar default 'SomeElectronic'" , length = 20)
  • 哦,嘿,现在可以了。谢谢。

标签: java spring hibernate jpa spring-boot


【解决方案1】:

问题可能是 Hibernate 无法添加新的非空列,而判别器是非空列..
在列具有 def 值的电子类中尝试以下代码..

@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, columnDefinition = "varchar default 'SomeElectronic'" , length = 20)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2012-12-02
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多