Запись не сохраняется в БД, но также не отображается ошибка - PullRequest
0 голосов
/ 14 октября 2019

Интересная вещь происходит. У меня есть Entity "Node" с @PrePersist и слушателем @PreUpdate при вызове метода save (). Затем он не выдает никакой ошибки, но также не обновляет (иногда. В большинстве случаев работает должным образом) мои данные. Но когда я теснозагляните в столбец updated_at, который я обновляю, используя аннотацию @PreUpdate.

И если я снова нажму на тот же запрос, он будет работать нормально.

Я не знаю, что происходит

Вот журнал a busy cat

Когда вы видите строку выше столбца "updated_at", дата совпадает с печатью в данном журнале. но другие данные двух столбцов не совпадают с запросом.

И когда я снова нажимаю на тот же запрос, он работает очень хорошо.

2019-10-14 11:13:57,023 INFO  {http-nio-8080-exec-16} [c.r.s.promise.dbService.NodeDBService   ] request_id=84511c75-7100-42de-a78d-5e6064642a5b Saved node 5943
2019-10-14 11:13:58,044 INFO  {http-nio-8080-exec-16} [c.r.s.p.dataService.NodeDataService     ] request_id=84511c75-7100-42de-a78d-5e6064642a5b Time taken by redis to fetch node detail from Redis 0
2019-10-14 11:13:58,054 INFO  {http-nio-8080-exec-16} [c.r.s.p.dataService.NodeDataService     ] request_id=84511c75-7100-42de-a78d-5e6064642a5b Time taken by redis to fetch node detail From DB 10
2019-10-14 11:13:58,055 INFO  {http-nio-8080-exec-16} [c.r.s.p.dataService.NodeDataService     ] request_id=84511c75-7100-42de-a78d-5e6064642a5b Change node disability done
2019-10-14 11:13:58,056 INFO  {http-nio-8080-exec-16} [.r.s.p.f.RequestAndResponseLoggingFilter] request_id=84511c75-7100-42de-a78d-5e6064642a5b 10.129.76.6|> {  "client":"TIBCO",  "disable":true,  "disabledDate":"2019-10-15T02:00:00",  "nodeLists":[    "5943"  ],  "tenantId":"RIL",  "time":"2019-10-14T11:09:45"}
2019-10-14 11:13:58,056 INFO  {http-nio-8080-exec-16} [.r.s.p.f.RequestAndResponseLoggingFilter] request_id=84511c75-7100-42de-a78d-5e6064642a5b 10.129.76.6|< 200 OK



public class AbstractListener {

    @PrePersist
    public void prePersist(AbstractEntity abstractEntity) {
        abstractEntity.setCreatedAt(LocalDateTime.now());
        abstractEntity.setUpdatedAt(LocalDateTime.now());
        abstractEntity.setRecordStatus(RecordStatus.ACTIVE);
    }

    @PreUpdate
    public void preUpdate(AbstractEntity abstractEntity) {
        abstractEntity.setUpdatedAt(LocalDateTime.now());
    }

}


@MappedSuperclass
@EntityListeners(AbstractListener.class)
public abstract class AbstractEntity implements Serializable {

    @Column
    private LocalDateTime createdAt;

    @Column
    private LocalDateTime updatedAt;

    @Column
    @Enumerated(EnumType.STRING)
    private RecordStatus recordStatus;

    @Column
    private String json;

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(LocalDateTime createdAt) {
        this.createdAt = createdAt;
    }

    public LocalDateTime getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(LocalDateTime updatedAt) {
        this.updatedAt = updatedAt;
    }

    public RecordStatus getRecordStatus() {
        return recordStatus;
    }

    public void setRecordStatus(RecordStatus recordStatus) {
        this.recordStatus = recordStatus;
    }

    public abstract void setId(Long id);

    public abstract Long getId();

    public String getJson() {
        return json;
    }

    public void setJson(String json) {
        this.json = json;
    }
}

@Entity
@Table(
        name = "node",
        uniqueConstraints = @UniqueConstraint(columnNames = {"nodeId", "tenantId"}))
public class Node extends AbstractEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "NODE_ENTITY_GENERATOR")
    @SequenceGenerator(name = "NODE_ENTITY_GENERATOR", sequenceName = "NODE_ENTITY_SEQUENCE", allocationSize = 1, initialValue = 100)
    private Long id;

    @Column(nullable = false)
    private String nodeId;

    @Column(nullable = false)
    private String tenantId;

    @Enumerated(EnumType.STRING)
    private NodeType nodeType;

    @Column
    private Integer capacity;

    @Column
    private Integer backlog;

    @Column
    private Integer tat;

    @Column
    private Integer pobBuffer;

    @Column
    private LocalDateTime backLogUpdatedAt;

    @Column
    private LocalDateTime nodeUpdatedAt;


    @OneToMany(mappedBy = "node")
    private List<NodeLeavesCalendar> leavesCalendarList;

    @OneToMany(mappedBy = "node")
    private List<NodeOCPCMapping> courierCutOfs;

    @Column
    private Integer firstMileDeliveryTime;

    @ManyToMany(fetch = FetchType.LAZY)
    private List<Node> connectedCDC;

    @OneToOne
    private Address address;

    @Column
    private Integer priority;

    @Column
    private Boolean disabled;

    @Column
    private LocalDateTime disabledTillDate;

    @OneToMany(mappedBy = "node", fetch = FetchType.LAZY)
    private List<NodeExtraInfo> nodeExtraInfos;


    @Column
    private LocalDateTime disableUpdatedAt;

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public void setId(Long id) {
        this.id = id;
    }

    public String getNodeId() {
        return nodeId;
    }

    public void setNodeId(String nodeId) {
        this.nodeId = nodeId;
    }

    public String getTenantId() {
        return tenantId;
    }

    public void setTenantId(String tenantId) {
        this.tenantId = tenantId;
    }

    public NodeType getNodeType() {
        return nodeType;
    }

    public void setNodeType(NodeType nodeType) {
        this.nodeType = nodeType;
    }

    public Integer getCapacity() {
        return capacity;
    }

    public void setCapacity(Integer capacity) {
        this.capacity = capacity;
    }

    public Integer getBacklog() {
        return backlog;
    }

    public void setBacklog(Integer backlog) {
        this.backlog = backlog;
    }

    public Integer getTat() {
        return tat;
    }

    public void setTat(Integer tat) {
        this.tat = tat;
    }

    public List<NodeLeavesCalendar> getLeavesCalendarList() {
        return leavesCalendarList;
    }

    public void setLeavesCalendarList(List<NodeLeavesCalendar> leavesCalendarList) {
        this.leavesCalendarList = leavesCalendarList;
    }

    public List<NodeOCPCMapping> getCourierCutOfs() {
        return courierCutOfs;
    }

    public void setCourierCutOfs(List<NodeOCPCMapping> courierCutOfs) {
        this.courierCutOfs = courierCutOfs;
    }

    public Integer getFirstMileDeliveryTime() {
        return firstMileDeliveryTime;
    }

    public void setFirstMileDeliveryTime(Integer firstMileDeliveryTime) {
        this.firstMileDeliveryTime = firstMileDeliveryTime;
    }

    public List<Node> getConnectedCDC() {
        return connectedCDC;
    }

    public void setConnectedCDC(List<Node> connectedCDC) {
        this.connectedCDC = connectedCDC;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Integer getPriority() {
        return priority;
    }

    public void setPriority(Integer priority) {
        this.priority = priority;
    }

    public Boolean getDisabled() {
        return disabled;
    }

    public void setDisabled(Boolean disabled) {
        this.disabled = disabled;
    }

    public List<NodeExtraInfo> getNodeExtraInfos() {
        return nodeExtraInfos;
    }

    public void setNodeExtraInfos(List<NodeExtraInfo> nodeExtraInfos) {
        this.nodeExtraInfos = nodeExtraInfos;
    }

    public Node() {
    }

    public Node(Long id) {
        this.id = id;
    }

    public Integer getPobBuffer() {
        return pobBuffer;
    }

    public void setPobBuffer(Integer pobBuffer) {
        this.pobBuffer = pobBuffer;
    }

    public LocalDateTime getBackLogUpdatedAt() {
        return backLogUpdatedAt;
    }

    public void setBackLogUpdatedAt(LocalDateTime backLogUpdatedAt) {
        this.backLogUpdatedAt = backLogUpdatedAt;
    }

    public LocalDateTime getNodeUpdatedAt() {
        return nodeUpdatedAt;
    }

    public void setNodeUpdatedAt(LocalDateTime nodeUpdatedAt) {
        this.nodeUpdatedAt = nodeUpdatedAt;
    }

    public LocalDateTime getDisableUpdatedAt() {
        return disableUpdatedAt;
    }

    public void setDisableUpdatedAt(LocalDateTime disableUpdatedAt) {
        this.disableUpdatedAt = disableUpdatedAt;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Node node = (Node) o;
        return nodeId.equals(node.nodeId) &&
                tenantId.equals(node.tenantId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nodeId, tenantId);
    }

    public LocalDateTime getDisabledTillDate() {
        return disabledTillDate;
    }

    public void setDisabledTillDate(LocalDateTime disabledTillDate) {
        this.disabledTillDate = disabledTillDate;
    }
}
 private void changeNodeDisability(String tenantId, String nodeId, Boolean disabled, LocalDateTime updatedTime, LocalDateTime disabledTillDate) {
        NodeCached nodeCached = getNode(nodeId, tenantId);
        if (nodeCached != null) {
            if ((nodeCached.getDisabledTillDate() == null || !DateTime.parse(nodeCached.getDisabledTillDate()).equals(DateTime.parse(disabledTillDate.toString())))) {
                Node node = nodeDbService.findByNodeIdAndTenantId(nodeId, tenantId);
                String nodeInActiveKey = IdUtility.genrateNodeInActivekey(tenantId);
                if (node.getDisableUpdatedAt() != null && node.getDisableUpdatedAt().compareTo(updatedTime) > 0) {
                    throw new RuntimeException(String.format("Time is lesser that last update for nodeId %s,current time %s,requested time %s", nodeId, node.getDisableUpdatedAt(), updatedTime));
                }
                node.setDisabled(disabled);
                node.setDisabledTillDate(disabledTillDate);
                node.setDisableUpdatedAt(updatedTime);
                nodeDbService.saveNode(node);
                inactiveNodesClientService.invalidate(nodeInActiveKey);
                fillDisabledNodeIfEmpty(tenantId);
                invalidateNode(nodeId, tenantId);// invalidate  node cache
                getNode(nodeId, tenantId);//Re-fill node cache
                LOGGER.info("Change node disability done ");
            } else {
                throw new RuntimeException("Same request");
            }
        } else {
            throw new NodeNotFoundException("Node not found " + nodeId);
        }
    }

  @Transactional
    public void saveNode(Node node) {
        nodeRepository.save(node);
        LOGGER.info("Saved node {} ", node.getNodeId());
    }

В коде вы видите, что я печатаю "Сохраненный узел {}". который также печатает в журнале, но

после нажатия на этот запрос, когда я обновляю disabledDate

{  "client":"TIBCO",  "disable":true,  "disabledDate":"2019-10-15T02:00:00",  "nodeLists":[    "5943"  ],  "tenantId":"RIL",  "time":"2019-10-14T11:09:45"}

эта отключенная дата не может отразить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...