[英]How to handle Runtime Polymorphism in Spring Boot?
我有抽象的 class 員工
public abstract class Employee {
private int employeeId;
private String name;
}
我還有兩個擴展Employee
的具體類,即當前為空的OfficeEmployee
和HomeEmployee
。 這是我的 controller:
@RestController
@RequestMapping("/api/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@PostMapping("/office")
public EmployeeResponse saveOfficeEmployee(@RequestBody OfficeEmployee request) {
return employeeService.save(request);
}
@PostMapping("/home")
public EmployeeResponse saveHomeEmployee(@RequestBody HomeEmployee request) {
return employeeService.save(request);
}
}
最后是 EmployeeService class:
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public Employee save(Employee request) {
// here i think i should do something like this: Employee employee = new OfficeEmployee or
// Employee employee = new HomeEmployee();
Employee employee = employeeRepository.save(employee);
return employee;
}
}
如何確定我從POST
請求中獲得了哪些員工? 我處理這個問題錯了嗎?
是的,抽象的 class 實體是我用來在多個表中添加公共列的東西。 例如,如果我想在許多表上添加 createdDate 和 updatedDate,我將在抽象實體 class(例如稱為 BaseDateEntity)中定義這兩個列,並在我想要使用的所有實體類中繼承它。 還要使用 @MappedSuperclass 注釋基本實體 class。 但是存儲庫應該是每個特定的實體類。 您不能為繼承抽象 Employee 實體的所有實體使用 1 個存儲庫,否則查詢將在您的超類 baseentity(=Employee) 的所有子類實體(OfficeEmployee、HomeEmployee、XyzEmployee、..)上執行,這可能就足夠了時。
您的實體代碼的粗略示例。
import java.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class Employee { //body skipped for brevity}
有一個替代方案。 在您的基礎實體上使用 @Entity 和 @DiscriminatorColumn。 並在您的子實體上使用 @Entity 和 @DiscriminatorValue。
@Entity
@DiscriminatorColumn
public abstract class Employee {//body skipped for brevity}
@Entity
@DiscriminatorValue("Officeemployee")
public class OfficeEmplyee extends Employee {}
您不能同時使用 MappedSuperclass 和實體。 所以選擇一個。
您的存儲庫的粗略示例
public interface EmployeeRepository<T extends Employee> extends JpaRepository<T, Long>{}
public interface OfficeEmployeeRepository extends JpaRepository<OfficeEmployee,Long>{}
顯然,我跳過了 HomeEmployee 的代碼示例,因為它與 OfficeEmployee 相同。
此外,如果您不想專門針對 OfficeEmployees 進行查詢,您也不需要 OfficeEmployeeRepository。 如果您總是查詢Employees 的所有子類,那么您只需要EmployeeRepository。 但是在這種情況下,我認為您需要 EmployeeRepository 來進行一般員工查詢,還需要 OfficeRepository 和 HomeRepository 來查詢特定類型的員工
為什么你認為你需要確定任何事情? EmployeeRepository
已經具備處理所有類型的Employees
的能力。
為此, Employee
必須是@Entity
。 不過,它仍然可以是抽象的。
作為旁注,具有單獨端點( /home
, /office
)的替代方法是將@JsonTypeInfo
與可用策略之一一起使用,以從輸入數據中確定Employee
子類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.