我是Spring Boot的新手。我有一个小应用程序,它有数据库。数据库包含表设备和边框。一个设备可以有许多边框,但一个边框只能有一个设备。我的问题是,当它有一个或多个边框时,我无法从数据库中删除设备。如果设备没有任何边框,我可以将其删除。
以下是我如何为设备表定义边框。
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinColumn(name="device_id")
private Collection<Borders> borders = new ArrayList<>();
以下是我在border-table中定义设备的方法:
@ManyToOne(cascade=CascadeType.ALL, optional=false)
@JoinColumn(name="device_id", updatable=false)
private Device device;
这是我在DeviceService-class中的方法,应删除设备。
@Transactional()
public Boolean deleteDevice(DeviceVM devParam) {
User user = getLoginUser();
return deviceRepository.findDeviceByUserIdAndName(user.getId(), devParam.getName())
.map(dev -> {
deviceRepository.delete(dev);
return true;
})
.orElse( false );
}
正如我之前所说,设备可以被删除,当它没有任何边框时,但是有边框,它就不能。希望有人可以帮助我。这是我从服务器可以看到的错误消息:
2016-10-26 16:31:16.092 ERROR 10016 --- [nio-8080-exec-7] flkimionpomo.aop.logging.LoggingAspect:fi.jurt.kimionpomo.web.rest.DeviceResource中的异常。 deleteDevice()with cause =&#39; org.hibernate.exception.ConstraintViolationException:无法执行语句&#39;和exception =&#39;无法执行语句; SQL [不适用];约束[null];嵌套异常是org.hibernate.exception.ConstraintViolationException:无法执行语句&#39; org.springframework.dao.DataIntegrityViolationException:无法执行语句; SQL [不适用];约束[null];嵌套异常是org.hibernate.exception.ConstraintViolationException:无法执行语句 在org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:278)
答案 0 :(得分:0)
从边框表中删除设备,您不必编写它。设备表中一对多的边框足以处理它。
答案 1 :(得分:0)
尝试删除:
(cascade=CascadeType.ALL, optional=false)
来自边境的@ManyToOne。我认为您在删除边框(子)时不想删除设备(父)。另外添加:
mappedBy="device"
在设备中的@OneToMany注释中。