慕工程0101907
2023-03-23 15:36:49
我正在開發(fā)管理狗旅館業(yè)務(wù)的 spring 應(yīng)用程序。在應(yīng)用程序中,我有兩個(gè)實(shí)體類 - Cage 和 Dog(其中一個(gè)狗屬性是 Cage)。狗和籠子的數(shù)據(jù)存儲(chǔ)在 MySQL 數(shù)據(jù)庫(kù)中。在應(yīng)用程序中,首先我們創(chuàng)建一個(gè) Dog 對(duì)象初始化屬性,如:姓名、年齡、種族、性別、主人姓名、主人編號(hào)。在 dogRepository 類中使用實(shí)體管理器 persist 方法后,數(shù)據(jù)庫(kù)中會(huì)出現(xiàn)一條新記錄:@Override@Transactionalpublic void createDog(String name, String race, int age, String sex, String ownerFullName, int ownerPhoneNumber) { Dog newDog = new Dog(name, race, age, sex, ownerFullName, ownerPhoneNumber); em.persist(newDog);}數(shù)據(jù)庫(kù)截圖除了我們?cè)趧?chuàng)建狗期間輸入的屬性外,我們可以為其分配籠子并初始化其他屬性:int durationOfStayInDays、LocalDate startOfStayDate、LocalDate endOfStayDate、int ownerCharge。問題是:當(dāng)狗分配了籠子時(shí),我可以使用實(shí)體管理器將其刪除,但是當(dāng)它沒有分配籠子時(shí),我在嘗試刪除它時(shí)收到 NullPointerException。以前我在沒有使用數(shù)據(jù)庫(kù)的情況下運(yùn)行應(yīng)用程序(記錄存儲(chǔ)在程序內(nèi)的地圖中)并且一切正常。在我的代碼中有 clases:Dog (Entity) --> DogRepository --> DogService --> DogController。以下是 DogRepository 和 Dog 類的代碼片段:狗類:@Transactionalpublic void setCage(Cage cage) { if(cage.isFree()) { this.cage = cage; this.startOfStayDate = LocalDate.now(); this.endOfStayDate = this.startOfStayDate.plusDays(this.durationOfStayInDays); cage.setFree(false); cage.setOccupied(true); }}public void setNullCage() { this.cage.setOccupied(false); this.cage.setFree(true); this.cage = null; this.startOfStayDate = null; this.endOfStayDate = null;}狗倉(cāng)庫(kù):@Override@Transactionalpublic void removeDog(Integer id) { Dog dog = getDogById(id); if (dog.getCage().isOccupied()) { dog.setNullCage(); } em.remove(dog);}狗服務(wù): public void removeDog(Integer id) { dogRepository.removeDog(id);}
3 回答

慕慕森
TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
發(fā)生這種情況是因?yàn)樵跈z查籠子是否被占用之前,您沒有檢查籠子是否為空。我認(rèn)為,代碼應(yīng)該是這樣的:
if (dog.getCage != null && dog.getCage().isOccupied()) { dog.setNullCage(); }
另外,您的方法 setNullCage() 也有同樣的缺陷。

MMTTMM
TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
1)Cage
如果aDog
上沒有
if (dog.getCage().isOccupied()) {
自然會(huì)失敗..你需要添加dog.getCage() != null &&
。
2)我不會(huì)把操縱的邏輯Entity1
放在Entity2
. 它們是兩個(gè)獨(dú)立的域。就個(gè)人而言,我會(huì)為此使用一些外部類。
3)您不需要在刪除它的地方明確地將其設(shè)置Cage
為空。Dog
除非您已經(jīng)cascade.REMOVE
配置并且您想明確避免這種情況。

溫溫醬
TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
我認(rèn)為您的代碼做得太過火了。替換下面的
if (dog.getCage().isOccupied()) { dog.setNullCage(); }
和
dog.setNullCage();
并更改setNullCage
為
public void setNullCage() { this.cage = null; }
一個(gè)更好的名字setNullCage
可能是clearCage
或removeCage
添加回答
舉報(bào)
0/150
提交
取消