我正在开发管理狗旅馆业务的 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() 也有同样的缺陷。
MMTTMM
TA贡献1869条经验 获得超4个赞
1)Cage如果aDog上没有
if (dog.getCage().isOccupied()) {自然会失败..你需要添加dog.getCage() != null &&。
2)我不会把操纵的逻辑Entity1放在Entity2. 它们是两个独立的域。就个人而言,我会为此使用一些外部类。
3)您不需要在删除它的地方明确地将其设置Cage为空。Dog除非您已经cascade.REMOVE配置并且您想明确避免这种情况。
温温酱
TA贡献1752条经验 获得超4个赞
我认为您的代码做得太过火了。替换下面的
if (dog.getCage().isOccupied()) {
dog.setNullCage();
}和
dog.setNullCage();
并更改setNullCage为
public void setNullCage() {
this.cage = null;
}一个更好的名字setNullCage可能是clearCage或removeCage
添加回答
举报
0/150
提交
取消
