在 JPA 中扩展实体类在“字段列表”错误中引发未知列“DTYPE”

Cor*_*chi 8 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, 
}
Run Code Online (Sandbox Code Playgroud)

Employee 类扩展了 Person

@Entity    
public class Employee extends Person {

    @Transient
    private Date joiningDate;   


    // Copy Constructors and Getter/Setter methods, 
}
Run Code Online (Sandbox Code Playgroud)

Employee 类只有一个瞬态对象所以我不确定是否使用 @DiscriminatorColumn 和 @DiscriminatorValue,当我尝试不使用会引发错误的鉴别器时

session.save(employee);
Run Code Online (Sandbox Code Playgroud)

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

sch*_*ebe 6

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

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

@Entity
@Table(name = "PERSON")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Person {    
Run Code Online (Sandbox Code Playgroud)

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

我在Thoughts on Java上找到了有用的解释

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


小智 3

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