簡體   English   中英

如何處理 Spring 引導中的運行時多態性?

[英]How to handle Runtime Polymorphism in Spring Boot?

我有抽象的 class 員工

public abstract class Employee {

private int employeeId;

private String name;
}

我還有兩個擴展Employee的具體類,即當前為空的OfficeEmployeeHomeEmployee 這是我的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM