Java 具有一对多映射的POST REST API:不能为null错误

Java 具有一对多映射的POST REST API:不能为null错误,java,hibernate,rest,spring-boot,one-to-many,Java,Hibernate,Rest,Spring Boot,One To Many,我有两个表:tbl\u服务和tbl\u子服务。一个服务可以有多个子服务。我正在使用springboot开发restapi,并试图在services和subservices表中发布数据。我可以在服务表中发布数据,但在子服务表中发布时遇到问题。这是一对多的双向映射 这是一个例外,我从邮递员那里得到的 { "timestamp": "2019-06-09T04:10:22.002+0000", "status": 500, "error": "Internal Server Error", "mess

我有两个表:
tbl\u服务
tbl\u子服务
。一个服务可以有多个子服务。我正在使用springboot开发restapi,并试图在services和subservices表中发布数据。我可以在
服务
表中发布数据,但在
子服务
表中发布时遇到问题。这是一对多的双向映射

这是一个例外,我从邮递员那里得到的

{
"timestamp": "2019-06-09T04:10:22.002+0000",
"status": 500,
"error": "Internal Server Error",
"message": "could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement",
"trace": "org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement\n\tat 
.
.
.
.
'tbl_services_id' cannot be null\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117)\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:955)\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1094)\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1042)\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1345)\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1027)\n\tat com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)\n\tat com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)\n\tat org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)\n\t... 94 more\n",
"path": "/api/subservices"
以下是两个表的结构:

实体类:
服务类

@Entity
@Table(name="tbl_services")
public class Service {

// define fields
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="tbl_services_id")
private int id;

@Column(name="service_name")
private String serviceName;

@Column(name="service_desc")
private String serviceDesc;

@Column(name="service_image")
private String serviceImage;

@OneToMany(mappedBy="service",
        cascade= {CascadeType.PERSIST, CascadeType.MERGE,
            CascadeType.DETACH, CascadeType.REFRESH})
private List<SubService> subServices;

public List<SubService> getSubServices() {
    return subServices;
}

public void setSubServices(List<SubService> subServices) {
    this.subServices = subServices;
}
}
我试图从邮递员发布数据,然后我得到一个异常。这是我从邮递员那里发布的数据

下面是SubServicesHibernateDAOImpl.class

@Override
public void saveSubService(SubService theSubService) {
    // get the current hibernate session
    Session currentSession = entityManager.unwrap(Session.class);
    System.out.println("SubService object : "+theSubService);       
    currentSession.saveOrUpdate(theSubService);
}  
编辑: 下面是我在saveSubService方法中接收到的json有效负载:

[id=0, service=null, subServiceName=GST, subServiceDesc=GST is a subservice which currently having , subServiceImage=path-to-image]
你会得到:

无法执行语句;SQL[n/a];约束[null]

我看到您正在请求中传递
服务
,但我没有看到您在保存
子服务
之前加载它:

@Override
public void saveSubService(SubService theSubService) {
    Session currentSession = entityManager.unwrap(Session.class);
    Service loadedService = currentSession.load(Service.class
           , theSubService.getService.getId();

    theSubService.setService(loadedService);         

    currentSession.saveOrUpdate(theSubService);
}
或者尝试简单地合并,因为您已经有了适当的级联:

@Override
public void saveSubService(SubService theSubService) {
    // get the current hibernate session
    Session currentSession = entityManager.unwrap(Session.class);
    System.out.println("SubService object : "+theSubService);       
    currentSession.merge(theSubService);
}

此外,我不确定您为什么需要
打开会话
EntityManager
及其接口在这种情况下就足够了。

如果我使用
merge
,那么它会给出与我所发布的问题相同的异常,如果我使用第一个解决方案,那么它会在
Service loadedService=currentSession.load中给出空指针异常(Service.class,theSubService.getService.getId();
您确定“服务”已正确映射到对象吗?在这种情况下,我似乎没有这样做。下面是我在saveSubService方法中接收到的json负载:`[id=0,service=null,subServiceName=GST,subServiceDesc=GST是一个子服务,当前具有,subServiceImage=path to image]`
@Override
public void saveSubService(SubService theSubService) {
    // get the current hibernate session
    Session currentSession = entityManager.unwrap(Session.class);
    System.out.println("SubService object : "+theSubService);       
    currentSession.merge(theSubService);
}