diff --git a/dao/src/main/java/org/thingsboard/server/dao/Dao.java b/dao/src/main/java/org/thingsboard/server/dao/Dao.java index 82b5837bcb..e26fdb79ac 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/Dao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/Dao.java @@ -39,6 +39,8 @@ public interface Dao { T saveAndFlush(TenantId tenantId, T t); + T create(TenantId tenantId, T t); + boolean removeById(TenantId tenantId, UUID id); void removeAllByIds(Collection ids); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java index 30919da561..58c8bffd07 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java @@ -19,14 +19,19 @@ import com.datastax.oss.driver.api.core.uuid.Uuids; import com.google.common.collect.Lists; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronizationManager; +import org.springframework.transaction.support.TransactionTemplate; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.model.BaseEntity; import org.thingsboard.server.dao.util.SqlDao; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; import java.util.Collection; import java.util.List; import java.util.Optional; @@ -41,6 +46,12 @@ public abstract class JpaAbstractDao, D> extends JpaAbstractDaoListeningExecutorService implements Dao { + @PersistenceContext + private EntityManager entityManager; + + @Autowired + private TransactionTemplate transactionTemplate; + protected abstract Class getEntityClass(); protected abstract JpaRepository getRepository(); @@ -51,6 +62,33 @@ public abstract class JpaAbstractDao, D> @Override @Transactional public D save(TenantId tenantId, D domain) { + E entity = prepare(domain); + entity = getRepository().save(entity); + return DaoUtil.getData(entity); + } + + @Override + @Transactional + public D saveAndFlush(TenantId tenantId, D domain) { + D d = save(tenantId, domain); + getRepository().flush(); + return d; + } + + @Override + public D create(TenantId tenantId, D domain) { + E entity = prepare(domain); + if (TransactionSynchronizationManager.isActualTransactionActive()) { + entityManager.persist(entity); + } else { + transactionTemplate.executeWithoutResult(ts -> { + entityManager.persist(entity); + }); + } + return DaoUtil.getData(entity); + } + + private E prepare(D domain) { E entity; try { entity = getEntityClass().getConstructor(domain.getClass()).newInstance(domain); @@ -65,16 +103,7 @@ public abstract class JpaAbstractDao, D> entity.setUuid(uuid); entity.setCreatedTime(Uuids.unixTimestamp(uuid)); } - entity = getRepository().save(entity); - return DaoUtil.getData(entity); - } - - @Override - @Transactional - public D saveAndFlush(TenantId tenantId, D domain) { - D d = save(tenantId, domain); - getRepository().flush(); - return d; + return entity; } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmCommentDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmCommentDao.java index dc31ed868a..f44049c7a1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmCommentDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmCommentDao.java @@ -57,8 +57,7 @@ public class JpaAlarmCommentDao extends JpaAbstractDao imp auditLog.setCreatedTime(Uuids.unixTimestamp(uuid)); } partitioningRepository.createPartitionIfNotExists(TABLE_NAME, auditLog.getCreatedTime(), TimeUnit.HOURS.toMillis(partitionSizeInHours)); - return super.save(tenantId, auditLog); + return create(tenantId, auditLog); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationDao.java index 57a8306fc1..16ca94395e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationDao.java @@ -16,7 +16,6 @@ package org.thingsboard.server.dao.sql.notification; import com.datastax.oss.driver.api.core.uuid.Uuids; -import com.google.common.base.Strings; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.jpa.repository.JpaRepository; @@ -60,6 +59,7 @@ public class JpaNotificationDao extends JpaAbstractDao