@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'在'字段列表'错误
答案 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
上找到了有用的解释仅供参考,我的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 {
这应该可以解决您的问题。