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

标签 java spring jpa nullpointerexception

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

@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);
}

database screenshot

除了我们在创建狗时输入的属性外,我们还可以为其分配笼子并初始化其他属性: inturationOfStayInDays、LocalDatestartOfStayDate、LocalDateendOfStayDate、intownerCharge。

问题是:当狗分配了笼子时,我可以使用实体管理器将其删除,但是当它没有分配笼子时,我在尝试删除它时会收到 NullPointerException 。以前,我在不使用数据库的情况下运行应用程序(记录存储在程序内的 map 中),并且一切正常。在我的代码中有类: Dog(实体)--> 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;
}

DogRepository:

@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);
}

最佳答案

发生这种情况是因为在检查笼子是否被占用之前,您没有检查笼子是否为空。我认为,代码应该如下所示:

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

此外,您的方法 setNullCage() 也有同样的缺陷。

关于java - 尝试使用 Spring 应用程序中的实体管理器从数据库中删除记录后出现 NullPointer 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57003939/

相关文章:

java - Dao实现中如何进行以下操作?

java - 使用 JPA 时是否可以禁用自动模式演化?

java - 如何在java中将包含从左到右和从右到左语言的字符串添加到StringBuilder

java - 如何根据 URL 中的_escaped_fragment_ 重定向到 Tomcat?

spring - 如何使用 spring 集成在电子邮件正文中附加文件

java - 如何在 Java POJO(文本、图像、Pdf、Doc 等)中为消息指定单个属性/字段?

java - 我可以在 Hazelcast 中使用 LinkedHashMap 吗?

java - Cq 6.0和6.1 sql2请求结果不同,但内容相同

java - 执行jar时未找到main

java - JPA 选择查询返回带有 @ManyToOne 映射的实体