Browse Source

Merge pull request #15361 from thingsboard/fix/rulechain-details-detach

Detach RuleChainDetailsEntity after findById to prevent stale version conflict
pull/15369/head
Viacheslav Klimov 6 months ago
committed by GitHub
parent
commit
d44538bda0
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 10
      dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDetailsDao.java
  2. 16
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDetailsDao.java

10
dao/src/main/java/org/thingsboard/server/dao/rule/RuleChainDetailsDao.java

@ -15,15 +15,9 @@
*/ */
package org.thingsboard.server.dao.rule; package org.thingsboard.server.dao.rule;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.rule.RuleChainDetails; import org.thingsboard.server.common.data.rule.RuleChainDetails;
import org.thingsboard.server.dao.Dao;
import java.util.UUID; public interface RuleChainDetailsDao extends Dao<RuleChainDetails> {
public interface RuleChainDetailsDao {
RuleChainDetails findById(TenantId tenantId, UUID id);
RuleChainDetails save(TenantId tenantId, RuleChainDetails ruleChainDetails);
} }

16
dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDetailsDao.java

@ -23,12 +23,14 @@ import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.rule.RuleChainDetails; import org.thingsboard.server.common.data.rule.RuleChainDetails;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.sql.RuleChainDetailsEntity; import org.thingsboard.server.dao.model.sql.RuleChainDetailsEntity;
import org.thingsboard.server.dao.rule.RuleChainDetailsDao; import org.thingsboard.server.dao.rule.RuleChainDetailsDao;
import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.sql.JpaAbstractDao;
import org.thingsboard.server.dao.util.SqlDao; import org.thingsboard.server.dao.util.SqlDao;
import org.thingsboard.server.exception.DataValidationException; import org.thingsboard.server.exception.DataValidationException;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@Slf4j @Slf4j
@ -40,9 +42,19 @@ public class JpaRuleChainDetailsDao extends JpaAbstractDao<RuleChainDetailsEntit
private final RuleChainDetailsRepository ruleChainDetailsRepository; private final RuleChainDetailsRepository ruleChainDetailsRepository;
@Override @Override
public RuleChainDetails save(TenantId tenantId, RuleChainDetails ruleChainDetails) { public RuleChainDetails findById(TenantId tenantId, UUID key) {
Optional<RuleChainDetailsEntity> entity = getRepository().findById(key);
// Detaching to avoid stale version conflict with RuleChainEntity which maps to the same table.
// Without detach, a loaded RuleChainDetailsEntity stays in the persistence context and becomes stale
// when the same row is updated via RuleChainEntity (e.g. during rule chain import with circular references).
entity.ifPresent(e -> getEntityManager().detach(e));
return DaoUtil.getData(entity);
}
@Override
protected RuleChainDetailsEntity doSave(RuleChainDetailsEntity entity, boolean isNew, boolean flush) {
try { try {
return super.save(tenantId, ruleChainDetails); return super.doSave(entity, isNew, flush);
} catch (Exception e) { } catch (Exception e) {
String rootMsg = ExceptionUtils.getRootCauseMessage(e); String rootMsg = ExceptionUtils.getRootCauseMessage(e);
if (StringUtils.contains(rootMsg, "value too long")) { if (StringUtils.contains(rootMsg, "value too long")) {

Loading…
Cancel
Save