【问题标题】:How to avoid hibernate from creating object of abstract class when using findAll() method?使用 findAll() 方法时如何避免休眠创建抽象类的对象?
【发布时间】:2022-01-19 22:12:05
【问题描述】:

我有抽象类 Employee 和 3 个从雇员扩展的具体类。 从Employee 扩展的类,例如OfficeEmployee 目前是空的,也代表数据库中的表。这些具体类的唯一目的是让 fk 引用Employee。例如,如果OfficeEmployee被创建,则Employee实体中会保存一个数据,OfficeEmployee实体中只会保存一个id。

这是我的 Employee 类:

@Entity
@Data
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "employee_id", nullable = false, unique = true)
private int employeeId;

@Column(name = "employee_name", nullable = false)
private String name;

@Column(name = "reason_for_deactivation", length = 255)
private String reasonForDeactivation = "";

@Column(name = "deleted", nullable = false)
private Boolean isDeleted = Boolean.FALSE;
}

我已经设法编写了用于保存、更新和删除特定员工的方法,但是当我想获取所有员工时,我不能这样做,因为后台休眠正在尝试从 Employee 类创建对象并且我得到错误,因为类是抽象的。

这是获取所有员工的方法:

@Service
public class EmployeeServiceImpl {

@Autowired
private EmployeeRepository employeeRepository;

  public List<Employee> findAll() {
    return employeeRepository.findAll();

 }
}

我该如何解决这个问题?我愿意接受任何建议,包括改变我的架构。

【问题讨论】:

  • 你有@DiscriminatorColumn 吗?您需要这样才能使 hibernate 实例化正确的子类。
  • 我假设你还没有找到stackoverflow.com/questions/25237664/…,请阅读它,看看它是否回答了你的问题
  • @MartinFrey 我试图避免在 Employee 中添加新列,但此时我别无选择。不过还是谢谢
  • 如果只是引用具有办公室的员工,以及其他没有附加属性的引用,您可以将员工设为具体类并使用多对多属性。

标签: java spring hibernate rest polymorphism


【解决方案1】:

最简单的解决方案是在Employee 实体上添加@DiscriminatorColumn,在具体类上添加@DiscriminatorValue。所以现在看起来像这样:

@Entity
@DiscriminatorColumn(name = "employee_type") // This is added
@Data
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "employee_id", nullable = false, unique = true)
private int employeeId;

@Column(name = "employee_name", nullable = false)
private String name;

@Column(name = "reason_for_deactivation", length = 255)
private String reasonForDeactivation = "";

@Column(name = "deleted", nullable = false)
private Boolean isDeleted = Boolean.FALSE;
}

具体类:

@Entity
@Data
@DiscriminatorValue("Office_Employee")  // This is added
public class OfficeEmployee extends Employee{

}

基本上,它将在名为employee_type 的Employee 实体中添加新列,并基于该列包含每个员工的类型信息,因此我现在可以获取所有员工。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多