OneToMany和ManyToOne注释会给我带来麻烦

时间:2016-10-27 13:43:18

标签: java spring hibernate one-to-many many-to-one

我是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)

2 个答案:

答案 0 :(得分:0)

从边框表中删除设备,您不必编写它。设备表中一对多的边框足以处理它。

答案 1 :(得分:0)

尝试删除:

(cascade=CascadeType.ALL, optional=false)

来自边境的@ManyToOne。我认为您在删除边框(子)时不想删除设备(父)。另外添加:

mappedBy="device"

在设备中的@OneToMany注释中。