为了账号安全,请及时绑定邮箱和手机立即绑定

尝试使用 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 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号