Интересная вещь происходит. У меня есть Entity "Node" с @PrePersist и слушателем @PreUpdate при вызове метода save (). Затем он не выдает никакой ошибки, но также не обновляет (иногда. В большинстве случаев работает должным образом) мои данные. Но когда я теснозагляните в столбец updated_at, который я обновляю, используя аннотацию @PreUpdate.
И если я снова нажму на тот же запрос, он будет работать нормально.
Я не знаю, что происходит
Вот журнал
Когда вы видите строку выше столбца "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"}
эта отключенная дата не может отразить.