@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对象
4条答案
按热度按时间hs1rzwqc1#
我在使用EclipseLink时遇到过同样的问题,并且我尝试使用@discriminator注解...但没有成功,因为在此解决方案中,必须在2个表中添加特定的列。
我没有在表中添加列的可能性,所以我找到了以下解决方案:
我刚刚将继承类型从SINGLE_TABLE更改为TABLE_PER_CLASS
我在Thoughts on Java上找到了有用的解释
仅供参考,我的2个表实际上是1个表和同一个表上的一个视图,具有2个或3个连接。
nnsrf1az2#
你应该使用@DiscriminatorColumn和@DiscriminatorValue。你可以找到一个很好的例子here。
fcy6dtqo3#
D_TYPE
基本上是子类的名称。假设您有:
将使用这些列创建employee表
其中
D_TYPE
将是子类名称。可以将emp作为
new FullTimeEmployee(id, name, salary);
传递插入后,它会自动将
d_type
填充为Full_Time_Employee如果要更改
D_TYPE
列的名称,请使用@DiscriminatorColumn(name="customizedNameofD_TYPE")
仅供参考:最常用的策略是
InheritanceType.JOINED
nimxete24#
保留子实体而非保留父实体。
还有
这应该可以解决您的问题。