所以我的問題是在我的項目中,我在我的服務類中使用模型映射器。因此,當服務調用 Dao 層(實際上只是一個 JPA Repository 接口)時,Dao 層現在成功返回實體而不是僅返回實際實體,我首先將其轉換為 DTO(這是實體的精確副本)使用java的模型映射器。因為我不想直接公開我的實體。代碼示例:public class FormService { @Autowired private FormMasterDao formMasterDao; @Autowired private ModelMapper mapper; public FormMasterDTO save(FormMasterDTO formMasterDTO) { FormMaster formMaster = buildFormMaster(formMasterDTO); return convertToFormMasterDTO(formMasterDao.save(formMaster)); } public List<FormMasterDTO> findById(String id) { return formMasterDao.findByIdIn(id) .stream() .map(this::convertToFormMasterDTO) .collect(toList()); } public void updateAll(List<FormMasterDTO> formMasterDTOList) { formMasterDao.saveAll(formMasterDTOList.stream() .map(this::convertToFormMaster) .collect(toList())); } public FormMasterDTO update(FormMasterDTO formMasterDTO) { return convertToFormMasterDTO(formMasterDao.save(convertToFormMaster(formMasterDTO))); } private FormMasterDTO convertToFormMasterDTO(FormMaster formMaster) { return mapper.map(formMaster, FormMasterDTO.class); } private FormMaster convertToFormMaster(FormMasterDTO formMasterDTO) { return mapper.map(formMasterDTO, FormMaster.class); }}我發現這種方法很有用,因為如果許多開發人員工作和編寫代碼,他們就不能直接使用實體。但我想知道,使用這種方法是否不好?會,它會影響 JVM,因為每次有人點擊服務時,我都會將其轉換為 DTO。
1 回答

拉丁的傳說
TA貢獻1789條經驗 獲得超8個贊
如果您擔心從純 JPA 對象轉換為 DTO 的時間成本,那么請不要擔心。這是為什么。
與許多其他操作相比,對象分配確實很慢,但與 IO 相比一點也不慢。我確信您的 JPA 服務會從數據庫中獲取一些東西。如果我是對的,那么突然間您花在新對象分配上的時間(以及以后產生的 GC 成本)將少于您花在 DB 操作本身上的時間的 0.01%。
如果您針對速度進行了優化,減少內存分配是一個好主意,但到目前為止,這應該不是您要做的第一件事。只有在優化成本更高的操作(例如數據庫查詢)之后才有意義。
免責聲明: 在某些情況下,您的 DTO 會被證明是昂貴的。如果您碰巧在 JPA 對象中使用延遲加載,那么您即將進行的 DTO 轉換將完全擊敗它。延遲加載將允許 JPA不獲取JPA 對象圖的某些子元素,但作為 DTO 轉換的一部分,您每次都會請求“可選”數據,這反過來會使您回到開始使用Lazy
.
添加回答
舉報
0/150
提交
取消