1

Read all similar questions but can't find solution. When getting parent and child from UI(json) everything is good. But when getting from UI(json) below request data(AddActionRequest) and doing some transformations getting error A different object with the same identifier value was already associated with the session : [com.asdet.model.jpa.ActionRequestParam#53] I really hope for help, rummaged a lot of things but I can’t understand why I'm getting this error.

@Data
public class AddActionRequest {
    private String externalRequestId;
    @JsonDeserialize(using = JsonDateTimeDeserializer.class)
    @JsonSerialize(using = JsonDateTimeSerializer.class)
    @ApiModelProperty(required = true, example = "01.01.2020 00:00:01")
    @JsonFormat(pattern = "dd.MM.yyyy HH:mm:ss")
    private Date requestDate;
    private String userIp;

    private JsonNode content;
}

Parent entity:

@Data
@Entity
@Table(name = "ts_action_requests")
@EqualsAndHashCode(exclude = {"params"})
public class ActionRequest {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_ts_action_requests")
    @SequenceGenerator(name = "sq_ts_action_requests", sequenceName = "sq_ts_action_requests", allocationSize = 0)
    private Integer requestId;
    private String externalRequestId;
    @JsonDeserialize(using = JsonDateTimeDeserializer.class)
    @JsonSerialize(using = JsonDateTimeSerializer.class)
    private Date requestDate;
    @JsonDeserialize(using = JsonDateTimeDeserializer.class)
    @JsonSerialize(using = JsonDateTimeSerializer.class)
    @Column(insertable = false, updatable = false)
    private Date createdOn;
    private String userIp;
    @JsonManagedReference
    @OneToMany(mappedBy = "request", cascade = CascadeType.ALL)
    private List<ActionRequestParam> params;

Child entity:

@Data
@Entity
@Table(name = "ts_action_request_params")
@ToString(exclude = {"request"})
public class ActionRequestParam {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_ts_action_request_params")
    @SequenceGenerator(name = "sq_ts_action_request_params", sequenceName = "sq_ts_action_request_params", allocationSize = 10)
    private Long requestParamId;
    @ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    @JsonBackReference
    @JoinColumn(foreignKey = @ForeignKey(name = "ts_action_request_params_f1"), name = "request_id", nullable = false)
    private ActionRequest request;
    @NotBlank
    private String paramName;
    private String paramValue;
    @JsonIgnore
    private Integer orderNo;
}

repositories:

@Repository
public interface ActionRequestRepository extends JpaRepository<ActionRequest, Integer> {
}

and

@Repository
public interface ActionRequestParamRepository extends JpaRepository<ActionRequestParam, Long> {
}

service:

@Service
@Transactional
public class ActionServiceImpl implements ActionService {
    @Autowired
    private ActionRequestRepository requestRepository;
    @Autowired
    private ActionResponseRepository responseRepository;
    
    @Override
    public ActionRequest addActionRequest(AddActionRequest request) throws Exception {
        ActionRequest r = new ActionRequest();

        r.setExternalRequestId(request.getExternalRequestId());
        r.setRequestDate(request.getRequestDate());
        r.setUserIp(request.getUserIp());

        Iterator<Map.Entry<String, JsonNode>> nodes = request.getContent().fields();
        List<ActionRequestParam> params = new ArrayList<>();
        int i = 1;
        while (nodes.hasNext()) {
            Map.Entry<String, JsonNode> entry = nodes.next();

            ActionRequestParam requestParam = new ActionRequestParam();
            requestParam.setParamName(entry.getKey());
            requestParam.setParamValue(entry.getValue().toString());
            requestParam.setOrderNo(i++);
            requestParam.setRequest(r);

            params.add(requestParam);
        }
        r.setParams(params);
        return requestRepository.save(r);
    }
}
qwerty
  • 87
  • 2
  • 8

1 Answers1

0

It was all about the generator So you must declare the same value on both allocationSize (Hibernate) and sequence increment by (DB) https://stackoverflow.com/a/19036625/12832902

qwerty
  • 87
  • 2
  • 8