亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試使用 spring 應用程序中的實體管理器從數據庫中刪除記錄后出現 NullPointer 異常

嘗試使用 spring 應用程序中的實體管理器從數據庫中刪除記錄后出現 NullPointer 異常

慕工程0101907 2023-03-23 15:36:49
我正在開發管理狗旅館業務的 spring 應用程序。在應用程序中,我有兩個實體類 - Cage 和 Dog(其中一個狗屬性是 Cage)。狗和籠子的數據存儲在 MySQL 數據庫中。在應用程序中,首先我們創建一個 Dog 對象初始化屬性,如:姓名、年齡、種族、性別、主人姓名、主人編號。在 dogRepository 類中使用實體管理器 persist 方法后,數據庫中會出現一條新記錄:@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);}數據庫截圖除了我們在創建狗期間輸入的屬性外,我們可以為其分配籠子并初始化其他屬性:int durationOfStayInDays、LocalDate startOfStayDate、LocalDate endOfStayDate、int ownerCharge。問題是:當狗分配了籠子時,我可以使用實體管理器將其刪除,但是當它沒有分配籠子時,我在嘗試刪除它時收到 NullPointerException。以前我在沒有使用數據庫的情況下運行應用程序(記錄存儲在程序內的地圖中)并且一切正常。在我的代碼中有 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;}狗倉庫:@Override@Transactionalpublic void removeDog(Integer id) {    Dog dog = getDogById(id);    if (dog.getCage().isOccupied()) {        dog.setNullCage();    }        em.remove(dog);}狗服務: public void removeDog(Integer id) {    dogRepository.removeDog(id);}
查看完整描述

3 回答

?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

發生這種情況是因為在檢查籠子是否被占用之前,您沒有檢查籠子是否為空。我認為,代碼應該是這樣的:

if (dog.getCage != null && dog.getCage().isOccupied()) {
    dog.setNullCage();
}

另外,您的方法 setNullCage() 也有同樣的缺陷。


查看完整回答
反對 回復 2023-03-23
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

1)Cage如果aDog上沒有

if (dog.getCage().isOccupied()) {

自然會失敗..你需要添加dog.getCage() != null &&。

2)我不會把操縱的邏輯Entity1放在Entity2. 它們是兩個獨立的域。就個人而言,我會為此使用一些外部類。

3)您不需要在刪除它的地方明確地將其設置Cage為空。Dog除非您已經cascade.REMOVE配置并且您想明確避免這種情況。


查看完整回答
反對 回復 2023-03-23
?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

我認為您的代碼做得太過火了。替換下面的

if (dog.getCage().isOccupied()) {
    dog.setNullCage();
}

dog.setNullCage();

并更改setNullCage

public void setNullCage() { 
    this.cage = null;
}

一個更好的名字setNullCage可能是clearCageremoveCage


查看完整回答
反對 回復 2023-03-23
  • 3 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號