user3212324
user3212324

Reputation: 173

Hibernate integrity constraint violation: NOT NULL check constraint: For onetoOne Mapping using spring boot crud

I am trying to create onetoone mapping between two tables where the parent key primary key acts as the primary key for child as well. While trying to save parent I am getting the following error.

Please find the below console log, model classes and service class used for the same. Can someone pls help to resolve the error.

Basically want to transfer the order id from order class to order id under compensation using crud repo.

Parent class:

    package com.newModel;
import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="ORDERS")
public class Order implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="ORDER_ID")
    private String orderId;

    @Column(name="ACCESS_ID")
    private String accessId;

    @OneToOne(cascade=CascadeType.ALL,mappedBy="order",fetch=FetchType.EAGER)
    private Compensation compensation;

//getters & setters 
    }

Child Class:

package com.newModel;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MapsId;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;



@Entity
@Table(name="COMPENSATION")
@NamedQuery(name="Compensation.findAll", query="SELECT o FROM Compensation o")
public class Compensation implements Serializable {
    private static final long serialVersionUID = 1L;

    /*@Id
    @Column(name="ORDER_ID")
    private String orderId;*/

    @Column(name="CHANNEL_DEALER_CODE")
    private String channelDealerCode;

    //bi-directional one-to-one association to Order

    @Id
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="ORDER_ID")
    private Order order;


}

Service class:

package com.sample.service;

import javax.ws.rs.core.Response;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.newModel.Order;


@Component
public class MobilityServiceImpl implements MobilityService {


    @Autowired
    private MobilityRepository mobilityRepo;

    @Override
    public Response getOrderDetails(String orderId) {

        Order orderDetails=mobilityRepo.findByOrderId(orderId);

        return Response.ok(orderDetails).build();
    }

    @Override
    public Response saveOrderDetails(Order orderDetails) {

        orderDetails.getCompensation().setOrder(orderDetails);

        Order orderResponse =mobilityRepo.save(orderDetails);
        String resp=orderResponse.getOrderId()+" is Success";
        return Response.ok(resp).build();
    }

    }

Console log:

 Hibernate: select order0_.order_id as order_id1_1_1_, order0_.access_id as access_i2_1_1_, compensati1_.order_id as order_id2_0_0_, compensati1_.channel_dealer_code as channel_1_0_0_ from orders order0_ left outer join compensation compensati1_ on order0_.order_id=compensati1_.order_id where order0_.order_id=?
Hibernate: select compensati0_.order_id as order_id2_0_0_, compensati0_.channel_dealer_code as channel_1_0_0_ from compensation compensati0_ where compensati0_.order_id=?
Hibernate: insert into orders (access_id, order_id) values (?, ?)
Hibernate: insert into compensation (channel_dealer_code, order_id) values (?, ?)
2018-11-23 16:13:53.210  WARN 17532 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: -10, SQLState: 23502
2018-11-23 16:13:53.211 ERROR 17532 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : integrity constraint violation: NOT NULL check constraint; SYS_CT_10118 table: COMPENSATION column: ORDER_ID
2018-11-23 16:13:53.214 ERROR 17532 --- [nio-8080-exec-1] o.h.i.ExceptionMapperStandardImpl        : HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
2018-11-23 16:13:53.244 ERROR 17532 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause

org.hsqldb.HsqlException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10118 table: COMPENSATION column: ORDER_ID

JSON Request:

{
  "orderId": "1006730",
  "accessId": "1810_CRU",
  "compensation": {

                "channelDealerCode": "ABCD"
                }
}

Upvotes: 0

Views: 1772

Answers (1)

ValerioMC
ValerioMC

Reputation: 3166

In yout Compensation entity you still need to have id and Order in separate properties and use MapsId to have the same id

@Entity
@Table(name="COMPENSATION")
@NamedQuery(name="Compensation.findAll", query="SELECT o FROM Compensation o")
public class Compensation implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private String id;

    @Column(name="CHANNEL_DEALER_CODE")
    private String channelDealerCode;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private Order order;
}

Upvotes: 0

Related Questions