在JPA中扩展实体类会抛出未知列' DTYPE'在'字段列表'错误

时间:2017-04-25 19:36:50

标签: java spring hibernate jpa

@Entity
@Table(name = "PERSON")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)  
public class Person {    
    @Id
    @GeneratedValue
    @Column(name = "PERSON_ID")
    private Long personId;

    @Column(name = "FIRSTNAME")
    private String firstname;

    @Column(name = "LASTNAME")
    private String lastname;

    // Constructors and Getter/Setter methods, 
}

Employee类扩展Person

@Entity    
public class Employee extends Person {

    @Transient
    private Date joiningDate;   


    // Copy Constructors and Getter/Setter methods, 
}

Employee类只有一个瞬态对象所以我不确定是否使用@DiscriminatorColumn和@DiscriminatorValue,当我尝试不使用Discriminator时抛出错误

session.save(employee);

我正在尝试保存引发未知列的“员工”对象' DTYPE'在'字段列表'错误

4 个答案:

答案 0 :(得分:2)

您应该使用@DiscriminatorColumn和@DiscriminatorValue。你可以找到一个很好的例子here

答案 1 :(得分:0)

我使用EclipseLink遇到了同样的问题,我尝试使用@discriminator注释...但没有成功 因为在此解决方案中,必须在2个表中添加特定列。

我无法在表格中添加列,因此我找到了以下解决方案:

@Entity
@Table(name = "PERSON")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Person {    

我刚刚将继承类型从SINGLE_TABLE更改为TABLE_PER_CLASS

我在Thoughts on Java

上找到了有用的解释

仅供参考,我的2个表实际上是1个表,同一个表上的视图有2个或3个连接。

答案 2 :(得分:0)

D_TYPE基本上是您的子类的名称。

让我们假设你有: 抽象雇员(id,name); FullTimeEmployee类扩展Employee(双倍薪水) 具有Iheritence.SINGLE_TABLE策略。

将使用以下列创建表员工 员工(D_TYPE,ID,姓名,薪水) D_TYPE将是您的子类的名称。

employeeRepository.insert(雇员emp); 在这里您可以将emp传递为新的FullTimeEmployee(id,name,salary);

插入后,它将自动将d_type填充为Full_Time_Employee

如果您想更改D_TYPE列的名称,请使用 @DiscriminatorColumn(name="customizedNameofD_TYPE")

仅供参考:最常用的策略是InheritanceType.JOINED

答案 3 :(得分:0)

坚持子实体,而不是持久保留父实体。

@MappedSuperclass
public class Person { 

@Entity
@Table(name = "PERSON")
public class Employee extends Person {

这应该可以解决您的问题。