'Create' method for dao (used for audit logs, notifications, alarm comments)

This commit is contained in:
ViacheslavKlimov 2024-01-29 11:11:02 +02:00
parent a8866ba387
commit e6d08e6528
5 changed files with 44 additions and 15 deletions

View File

@ -39,6 +39,8 @@ public interface Dao<T> {
T saveAndFlush(TenantId tenantId, T t); T saveAndFlush(TenantId tenantId, T t);
T create(TenantId tenantId, T t);
boolean removeById(TenantId tenantId, UUID id); boolean removeById(TenantId tenantId, UUID id);
void removeAllByIds(Collection<UUID> ids); void removeAllByIds(Collection<UUID> ids);

View File

@ -19,14 +19,19 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.transaction.annotation.Transactional; 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.common.data.id.TenantId;
import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.Dao;
import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.BaseEntity; import org.thingsboard.server.dao.model.BaseEntity;
import org.thingsboard.server.dao.util.SqlDao; import org.thingsboard.server.dao.util.SqlDao;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -41,6 +46,12 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D>
extends JpaAbstractDaoListeningExecutorService extends JpaAbstractDaoListeningExecutorService
implements Dao<D> { implements Dao<D> {
@PersistenceContext
private EntityManager entityManager;
@Autowired
private TransactionTemplate transactionTemplate;
protected abstract Class<E> getEntityClass(); protected abstract Class<E> getEntityClass();
protected abstract JpaRepository<E, UUID> getRepository(); protected abstract JpaRepository<E, UUID> getRepository();
@ -51,6 +62,33 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D>
@Override @Override
@Transactional @Transactional
public D save(TenantId tenantId, D domain) { 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; E entity;
try { try {
entity = getEntityClass().getConstructor(domain.getClass()).newInstance(domain); entity = getEntityClass().getConstructor(domain.getClass()).newInstance(domain);
@ -65,16 +103,7 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D>
entity.setUuid(uuid); entity.setUuid(uuid);
entity.setCreatedTime(Uuids.unixTimestamp(uuid)); entity.setCreatedTime(Uuids.unixTimestamp(uuid));
} }
entity = getRepository().save(entity); return entity;
return DaoUtil.getData(entity);
}
@Override
@Transactional
public D saveAndFlush(TenantId tenantId, D domain) {
D d = save(tenantId, domain);
getRepository().flush();
return d;
} }
@Override @Override

View File

@ -57,8 +57,7 @@ public class JpaAlarmCommentDao extends JpaAbstractDao<AlarmCommentEntity, Alarm
public AlarmComment createAlarmComment(TenantId tenantId, AlarmComment alarmComment){ public AlarmComment createAlarmComment(TenantId tenantId, AlarmComment alarmComment){
log.trace("Saving entity {}", alarmComment); log.trace("Saving entity {}", alarmComment);
partitioningRepository.createPartitionIfNotExists(ALARM_COMMENT_TABLE_NAME, alarmComment.getCreatedTime(), TimeUnit.HOURS.toMillis(partitionSizeInHours)); partitioningRepository.createPartitionIfNotExists(ALARM_COMMENT_TABLE_NAME, alarmComment.getCreatedTime(), TimeUnit.HOURS.toMillis(partitionSizeInHours));
AlarmCommentEntity saved = alarmCommentRepository.save(new AlarmCommentEntity(alarmComment)); return create(tenantId, alarmComment);
return DaoUtil.getData(saved);
} }
@Override @Override

View File

@ -41,7 +41,6 @@ import org.thingsboard.server.dao.sqlts.insert.sql.SqlPartitioningRepository;
import org.thingsboard.server.dao.util.SqlDao; import org.thingsboard.server.dao.util.SqlDao;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -88,7 +87,7 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp
auditLog.setCreatedTime(Uuids.unixTimestamp(uuid)); auditLog.setCreatedTime(Uuids.unixTimestamp(uuid));
} }
partitioningRepository.createPartitionIfNotExists(TABLE_NAME, auditLog.getCreatedTime(), TimeUnit.HOURS.toMillis(partitionSizeInHours)); partitioningRepository.createPartitionIfNotExists(TABLE_NAME, auditLog.getCreatedTime(), TimeUnit.HOURS.toMillis(partitionSizeInHours));
return super.save(tenantId, auditLog); return create(tenantId, auditLog);
} }
@Override @Override

View File

@ -16,7 +16,6 @@
package org.thingsboard.server.dao.sql.notification; package org.thingsboard.server.dao.sql.notification;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.google.common.base.Strings;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
@ -60,6 +59,7 @@ public class JpaNotificationDao extends JpaAbstractDao<NotificationEntity, Notif
notification.setCreatedTime(Uuids.unixTimestamp(uuid)); notification.setCreatedTime(Uuids.unixTimestamp(uuid));
partitioningRepository.createPartitionIfNotExists(ModelConstants.NOTIFICATION_TABLE_NAME, partitioningRepository.createPartitionIfNotExists(ModelConstants.NOTIFICATION_TABLE_NAME,
notification.getCreatedTime(), TimeUnit.HOURS.toMillis(partitionSizeInHours)); notification.getCreatedTime(), TimeUnit.HOURS.toMillis(partitionSizeInHours));
return create(tenantId, notification);
} }
return super.save(tenantId, notification); return super.save(tenantId, notification);
} }