我有一個像這樣的嵌套物體的物體
public class MyEntity {
@ManyToOne
@JoinColumn(name="FK_ENTITY2")
private Entity2 fkEntity2;
@ManyToOne
@JoinColumn(name="FK_ENTITY3")
private Entity3 fkEntity3;
}
與 entity2 和 entity3 類似:
public class Entity2/3{
@Id
private Long id;
@Column(name = "code")
private String code;
@Column(name = "desc")
private String desc;
//getter and setter etc
}
兩者Entity2和Entity3都有存盤在資料庫中的值,所以當我在 上進行插入時MyEntity,我正在這樣做:
@Transactional
@Service
public MyService {
//idFromController and otherIdFromController refers to existent records in the database
public MyDto save(Long idFromController, Long otherIdFromController){
Entity2 entity2 = new Entity2();
entity2.setId(idFromController);
Entity3 entity3 = new Entity3();
entity3.setId(otherIdFromController);
MyEntity newMyEntity = new MyEntity();
newMyEntity.setEntity2(entity2);
newMyEntity.setEntity3(entity3);
MyEntity result = myEntityRepository.saveAndFlush(newMyEntity);
return getDto(result);
}
}
它作業正常,資料使用正確的外鍵正確存盤在資料庫中但是...插入后我想構建一個包含來自嵌套物體的 id、代碼和 desc 的 DTO,如下所示:
private MyDto getDto(MyEntity result){
MyDto dto = new MyDto();
dto.setId2(result.getEntity2().getId());
dto.setCode2(result.getEntity2().getCode());
dto.setDesc2(result.getEntity2().getDesc());
dto.setId3(result.getEntity3().getId());
dto.setCode3(result.getEntity3().getCode());
dto.setDesc3(result.getEntity3().getDesc());
}
這是問題所在,我只有 id 欄位和代碼和描述為空。
當我getDto()在搜索中呼叫它時,它可以作業并且每個欄位都有正確的值,所以它與插入事務有關嗎?我怎么能解決這個問題?
uj5u.com熱心網友回復:
創建 DTO 時,(現有)物體未附加到持久化背景關系,因此尚未從 DB 加載相應的資料,無法將其復制到 DTO。
一種選擇是加載物體,例如通過“myRepository.findById...”并關聯回傳的(托管)物體。
uj5u.com熱心網友回復:
您錯過了多對一關系的某些部分。首先在 MyEntity課堂上最好定義一個獲取型別。在Entity2并且Entity3您需要定義@OneToMany為與獲取型別宣告的關系的另一端,并且cascade = CascadeType.ALL它只是告訴休眠它可以在您執行保存,洗掉,更新時對相關物體做什么。我重新格式化您的代碼如下
public class Entity2/3{
@Id
private Long id;
@Column(name = "code")
private String code;
@Column(name = "desc")
private String desc;
@OneToMany(cascade = CascadeType.ALL,mappedBy ="fkEntity2",fetch=FetchType.LAZY)
private List<Entity2> entityTwoList;
// for Entity3
@OneToMany(cascade = CascadeType.ALL,mappedBy ="fkEntity3",fetch=FetchType.LAZY)
private List<Entity3> entityThreeList;
public class MyEntity {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="FK_ENTITY2")
private Entity2 fkEntity2;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="FK_ENTITY3")
private Entity3 fkEntity3;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/412178.html
標籤:
