【问题标题】:Spring Data JPA - A different object with the same identifier value was already associated with the sessionSpring Data JPA - 具有相同标识符值的不同对象已与会话关联
【发布时间】:2020-10-12 05:15:29
【问题描述】:

阅读所有类似的问题,但找不到解决方案。从 UI(json) 获取父母和孩子时,一切都很好。但是,当从请求数据(AddActionRequest)下方的 UI(json)获取并进行一些转换时,会出现错误 A different object with the same identifier value has been associated with the session:[com.asdet.model.jpa.ActionRequestParam#53] 我真的希望得到帮助,翻了很多东西,但我不明白为什么会出现这个错误。

@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;
}

父实体:

@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;

子实体:

@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;
}

存储库:

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

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

服务:

@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);
    }
}

【问题讨论】:

    标签: spring hibernate jpa spring-data-jpa spring-data


    【解决方案1】:

    一切都与发电机有关 因此,您必须在 allocationSize (Hibernate) 和序列增量 (DB) 上声明相同的值 https://stackoverflow.com/a/19036625/12832902

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2013-08-30
      • 2021-09-24
      相关资源
      最近更新 更多