У меня есть абстрактный класс Employee и 3 конкретных класса, которые расширяются от сотрудника. Классы, которые расширяются от Employee, например OfficeEmployee, в настоящее время пусты и также представляют таблицу в db. Единственная цель этих конкретных классов - иметь fk ссылку на Employee. Например, если создается OfficeEmployee, данные будут сохранены в объекте Employee, и только идентификатор будет сохранен в объекте OfficeEmployee.

Это мой класс сотрудников:

@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();

 }
}

Как я могу решить эту проблему? Я открыт для любого совета, включая изменение моей архитектуры.

0
N J 16 Дек 2021 в 23:51
У вас есть @DiscriminatorColumn? Вам это нужно, чтобы спящий режим мог создать правильный подкласс.
 – 
Martin Frey
17 Дек 2021 в 01:20
Я полагаю, вы не нашли stackoverflow.com/questions/25237664/…, пожалуйста, прочтите его и посмотрите, ответит ли он на ваш вопрос
 – 
PaulD
17 Дек 2021 в 11:56
Я пытался избежать добавления нового столбца в «Сотрудник», но на данный момент у меня нет выбора. Спасибо хоть
 – 
N J
17 Дек 2021 в 12:17
Если речь идет только о ссылке на сотрудника с офисом и других ссылках без дополнительных атрибутов, вы можете сделать сотрудника конкретным классом и использовать множество свойств.
 – 
Martin Frey
18 Дек 2021 в 00:39

1 ответ

Лучший ответ

Самое простое решение - добавить @DiscriminatorColumn к объекту Employee и @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 и на основе этого будет иметь информацию о типе каждого сотрудника, поэтому теперь я могу получить всех сотрудников.

0
N J 17 Дек 2021 в 12:24