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

v6ylcynt  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(413)
@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类只有一个 transient 对象,所以我不确定是否使用@DiscriminatorColumn和@DiscriminatorValue,当我尝试不使用引发错误的鉴别器时

session.save(employee);

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

hs1rzwqc

hs1rzwqc1#

我在使用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个连接。

nnsrf1az

nnsrf1az2#

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

fcy6dtqo

fcy6dtqo3#

D_TYPE基本上是子类的名称。
假设您有:

  • 抽象员工(标识、姓名);
  • 类FullTimeEmployee扩展雇员(双倍薪金)
  • 使用继承.SINGLE_TABLE策略。

将使用这些列创建employee表

Employee (D_TYPE, id, name, salary)

其中D_TYPE将是子类名称。

employeeRepository.insert(Employee emp);

可以将emp作为new FullTimeEmployee(id, name, salary);传递
插入后,它会自动将d_type填充为Full_Time_Employee
如果要更改D_TYPE列的名称,请使用@DiscriminatorColumn(name="customizedNameofD_TYPE")
仅供参考:最常用的策略是InheritanceType.JOINED

nimxete2

nimxete24#

保留子实体而非保留父实体。

@MappedSuperclass
public class Person {

还有

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

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

相关问题