尝试使用 spring 应用程序中的实体管理器从数据库中删除记录后出现 NullPointer 异常

我正在开发管理狗旅馆业务的 spring 应用程序。在应用程序中,我有两个实体类 - Cage 和 Dog(其中一个狗属性是 Cage)。狗和笼子的数据存储在 MySQL 数据库中。在应用程序中,首先我们创建一个 Dog 对象初始化属性,如:姓名、年龄、种族、性别、主人姓名、主人编号。在 dogRepository 类中使用实体管理器 persist 方法后,数据库中会出现一条新记录:


@Override

@Transactional

public 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 类的代码片段:


狗类:


@Transactional

public 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

@Transactional

public 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);

}


慕工程0101907
浏览 164回答 3
3回答

慕慕森

发生这种情况是因为在检查笼子是否被占用之前,您没有检查笼子是否为空。我认为,代码应该是这样的:if (dog.getCage != null && dog.getCage().isOccupied()) {     dog.setNullCage(); }另外,您的方法 setNullCage() 也有同样的缺陷。

MMTTMM

1)Cage如果aDog上没有if (dog.getCage().isOccupied()) {自然会失败..你需要添加dog.getCage() != null &&。2)我不会把操纵的逻辑Entity1放在Entity2. 它们是两个独立的域。就个人而言,我会为此使用一些外部类。3)您不需要在删除它的地方明确地将其设置Cage为空。Dog除非您已经cascade.REMOVE配置并且您想明确避免这种情况。

温温酱

我认为您的代码做得太过火了。替换下面的if (dog.getCage().isOccupied()) {     dog.setNullCage(); }和dog.setNullCage();并更改setNullCage为public void setNullCage() {      this.cage = null; }一个更好的名字setNullCage可能是clearCage或removeCage
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java