@ -26,10 +26,8 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.transaction.annotation.Transactional ;
import org.springframework.transaction.annotation.Transactional ;
import org.thingsboard.common.util.JacksonUtil ;
import org.thingsboard.common.util.JacksonUtil ;
import org.thingsboard.server.cluster.TbClusterService ;
import org.thingsboard.server.cluster.TbClusterService ;
import org.thingsboard.server.common.data.Device ;
import org.thingsboard.server.common.data.EntityType ;
import org.thingsboard.server.common.data.EntityType ;
import org.thingsboard.server.common.data.ExportableEntity ;
import org.thingsboard.server.common.data.ExportableEntity ;
import org.thingsboard.server.common.data.HasCustomerId ;
import org.thingsboard.server.common.data.audit.ActionType ;
import org.thingsboard.server.common.data.audit.ActionType ;
import org.thingsboard.server.common.data.exception.ThingsboardException ;
import org.thingsboard.server.common.data.exception.ThingsboardException ;
import org.thingsboard.server.common.data.id.EntityId ;
import org.thingsboard.server.common.data.id.EntityId ;
@ -49,13 +47,13 @@ import org.thingsboard.server.common.data.relation.RelationTypeGroup;
import org.thingsboard.server.common.data.sync.ie.AttributeExportData ;
import org.thingsboard.server.common.data.sync.ie.AttributeExportData ;
import org.thingsboard.server.common.data.sync.ie.EntityExportData ;
import org.thingsboard.server.common.data.sync.ie.EntityExportData ;
import org.thingsboard.server.common.data.sync.ie.EntityImportResult ;
import org.thingsboard.server.common.data.sync.ie.EntityImportResult ;
import org.thingsboard.server.dao.relation.RelationDao ;
import org.thingsboard.server.dao.relation.RelationService ;
import org.thingsboard.server.dao.relation.RelationService ;
import org.thingsboard.server.service.action.EntityActionService ;
import org.thingsboard.server.service.action.EntityActionService ;
import org.thingsboard.server.service.entitiy.TbNotificationEntityService ;
import org.thingsboard.server.service.entitiy.TbNotificationEntityService ;
import org.thingsboard.server.service.security.model.SecurityUser ;
import org.thingsboard.server.service.security.model.SecurityUser ;
import org.thingsboard.server.service.sync.ie.exporting.ExportableEntitiesService ;
import org.thingsboard.server.service.sync.ie.exporting.ExportableEntitiesService ;
import org.thingsboard.server.service.sync.ie.importing.EntityImportService ;
import org.thingsboard.server.service.sync.ie.importing.EntityImportService ;
import org.thingsboard.server.service.sync.vc.data.EntitiesExportCtx ;
import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx ;
import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx ;
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService ;
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService ;
@ -79,6 +77,8 @@ public abstract class BaseEntityImportService<I extends EntityId, E extends Expo
@Autowired
@Autowired
private RelationService relationService ;
private RelationService relationService ;
@Autowired
@Autowired
private RelationDao relationDao ;
@Autowired
private TelemetrySubscriptionService tsSubService ;
private TelemetrySubscriptionService tsSubService ;
@Autowired
@Autowired
protected EntityActionService entityActionService ;
protected EntityActionService entityActionService ;
@ -203,14 +203,15 @@ public abstract class BaseEntityImportService<I extends EntityId, E extends Expo
if ( importResult . getOldEntity ( ) ! = null ) {
if ( importResult . getOldEntity ( ) ! = null ) {
List < EntityRelation > existingRelations = new ArrayList < > ( ) ;
List < EntityRelation > existingRelations = new ArrayList < > ( ) ;
existingRelations . addAll ( relationService . findByTo ( tenantId , entity . getId ( ) , RelationTypeGroup . COMMON ) ) ;
existingRelations . addAll ( relationDao . findAllByTo ( tenantId , entity . getId ( ) , RelationTypeGroup . COMMON ) ) ;
existingRelations . addAll ( relationService . findByFrom ( tenantId , entity . getId ( ) , RelationTypeGroup . COMMON ) ) ;
existingRelations . addAll ( relationDao . findAllByFrom ( tenantId , entity . getId ( ) , RelationTypeGroup . COMMON ) ) ;
// dao is used here instead of service to avoid getting cached values, because relationService.deleteRelation will evict value from cache only after transaction is committed
for ( EntityRelation existingRelation : existingRelations ) {
for ( EntityRelation existingRelation : existingRelations ) {
EntityRelation relation = relationsMap . get ( existingRelation ) ;
EntityRelation relation = relationsMap . get ( existingRelation ) ;
if ( relation = = null ) {
if ( relation = = null ) {
importResult . setUpdatedRelatedEntities ( true ) ;
importResult . setUpdatedRelatedEntities ( true ) ;
relationService . deleteRelation ( tenantId , existingRelation ) ;
relationService . deleteRelation ( c tx . getT enantId( ) , existingRelation . getFrom ( ) , existingRelation . getTo ( ) , existingRelation . getType ( ) , existingRelation . getTypeGroup ( ) ) ;
importResult . addSendEventsCallback ( ( ) - > {
importResult . addSendEventsCallback ( ( ) - > {
entityNotificationService . notifyCreateOrUpdateOrDeleteRelation ( tenantId , null ,
entityNotificationService . notifyCreateOrUpdateOrDeleteRelation ( tenantId , null ,
existingRelation , ctx . getUser ( ) , ActionType . RELATION_DELETED , null , existingRelation ) ;
existingRelation , ctx . getUser ( ) , ActionType . RELATION_DELETED , null , existingRelation ) ;