diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 7c04147..319b75d 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -1,6 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteEntity.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteEntity.java
new file mode 100644
index 0000000..2292100
--- /dev/null
+++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteEntity.java
@@ -0,0 +1,27 @@
+package com.eshore.gringotts.web.domain.base.entity;
+
+import javax.persistence.Column;
+import javax.persistence.EntityListeners;
+import javax.persistence.MappedSuperclass;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+/**
+ * 实体类公共字段
+ *
+ * @author lanyuanxiaoyao
+ * @date 2024-11-20
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+@MappedSuperclass
+@EntityListeners(AuditingEntityListener.class)
+public class LogicDeleteEntity extends SimpleEntity {
+ public static final String LOGIC_DELETE_CLAUSE = "deleted = false";
+
+ @Column(nullable = false)
+ private Boolean deleted = false;
+}
diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteIdOnlyEntity.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteIdOnlyEntity.java
new file mode 100644
index 0000000..0f43598
--- /dev/null
+++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteIdOnlyEntity.java
@@ -0,0 +1,27 @@
+package com.eshore.gringotts.web.domain.base.entity;
+
+import javax.persistence.Column;
+import javax.persistence.EntityListeners;
+import javax.persistence.MappedSuperclass;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+/**
+ * 实体类公共字段
+ *
+ * @author lanyuanxiaoyao
+ * @date 2024-11-20
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+@MappedSuperclass
+@EntityListeners(AuditingEntityListener.class)
+public class LogicDeleteIdOnlyEntity extends IdOnlyEntity {
+ public static final String LOGIC_DELETE_CLAUSE = "deleted = false";
+
+ @Column(nullable = false)
+ private Boolean deleted = false;
+}
diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java
new file mode 100644
index 0000000..d862d5e
--- /dev/null
+++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java
@@ -0,0 +1,50 @@
+package com.eshore.gringotts.web.domain.base.service;
+
+import cn.hutool.core.util.ClassUtil;
+import cn.hutool.core.util.StrUtil;
+import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity;
+import com.eshore.gringotts.web.domain.base.repository.SimpleRepository;
+import com.eshore.gringotts.web.domain.user.service.UserService;
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.transaction.Transactional;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.collections.api.factory.Lists;
+import org.eclipse.collections.api.list.ImmutableList;
+
+/**
+ * @author lanyuanxiaoyao
+ * @date 2024-11-21
+ */
+@Slf4j
+public abstract class LogicDeleteService extends SimpleServiceSupport {
+ private final EntityManager manager;
+
+ public LogicDeleteService(SimpleRepository repository, UserService userService, EntityManager manager) {
+ super(repository, userService);
+ this.manager = manager;
+ }
+
+ @Override
+ protected ImmutableList extraListPredicates(Root root, CriteriaQuery> query, CriteriaBuilder builder) {
+ return Lists.immutable.of(builder.equal(root.get("deleted"), false));
+ }
+
+ @Override
+ protected ImmutableList extraDetailPredicates(Root root, CriteriaQuery> query, CriteriaBuilder builder) {
+ return Lists.immutable.of(builder.equal(root.get("deleted"), false));
+ }
+
+ @Transactional(rollbackOn = Throwable.class)
+ @Override
+ public void remove(Long id) {
+ String entityName = ClassUtil.getTypeArgument(this.getClass()).getSimpleName();
+ Query query = manager.createQuery(StrUtil.format("update {} entity set deleted=true where id=?1", entityName));
+ query.setParameter(1, id);
+ query.executeUpdate();
+ }
+}
diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/SimpleServiceSupport.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/SimpleServiceSupport.java
index d21076e..8900c3a 100644
--- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/SimpleServiceSupport.java
+++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/SimpleServiceSupport.java
@@ -9,7 +9,10 @@ import com.eshore.gringotts.web.domain.base.repository.SimpleRepository;
import com.eshore.gringotts.web.domain.user.entity.User;
import com.eshore.gringotts.web.domain.user.service.UserService;
import java.util.Optional;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
import javax.transaction.Transactional;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.collections.api.factory.Lists;
@@ -24,8 +27,8 @@ import org.springframework.data.domain.Sort;
*/
@Slf4j
public abstract class SimpleServiceSupport implements SimpleService {
- private final SimpleRepository repository;
- private final UserService userService;
+ protected final SimpleRepository repository;
+ protected final UserService userService;
public SimpleServiceSupport(SimpleRepository repository, UserService userService) {
this.repository = repository;
@@ -64,6 +67,7 @@ public abstract class SimpleServiceSupport implemen
if (User.isNotAdministrator(user)) {
predicates.add(builder.equal(root.get("createdUser"), user));
}
+ predicates.addAllIterable(extraListPredicates(root, query, builder));
return builder.and(predicates.toArray(new Predicate[predicates.size()]));
},
Sort.by("createdTime").descending()
@@ -81,12 +85,17 @@ public abstract class SimpleServiceSupport implemen
if (User.isNotAdministrator(user)) {
predicates.add(builder.equal(root.get("createdUser"), user));
}
+ predicates.addAllIterable(extraListPredicates(root, query, builder));
return builder.and(predicates.toArray(new Predicate[predicates.size()]));
},
Sort.by("createdTime").descending()
));
}
+ protected ImmutableList extraListPredicates(Root root, CriteriaQuery> query, CriteriaBuilder builder) {
+ return Lists.immutable.empty();
+ }
+
@Override
public Optional detailOptional(Long id) {
if (ObjectUtil.isNull(id)) {
@@ -101,11 +110,16 @@ public abstract class SimpleServiceSupport implemen
if (User.isNotAdministrator(user)) {
predicates.add(builder.equal(root.get("createdUser"), user));
}
+ predicates.addAllIterable(extraDetailPredicates(root, query, builder));
return builder.and(predicates.toArray(new Predicate[predicates.size()]));
}
);
}
+ protected ImmutableList extraDetailPredicates(Root root, CriteriaQuery> query, CriteriaBuilder builder) {
+ return Lists.immutable.empty();
+ }
+
@Override
public ENTITY detail(Long id) {
return detailOrNull(id);
diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/entity/Confirmation.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/entity/Confirmation.java
index 70b6094..81e7632 100644
--- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/entity/Confirmation.java
+++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/entity/Confirmation.java
@@ -1,7 +1,7 @@
package com.eshore.gringotts.web.domain.confirmation.entity;
import com.eshore.gringotts.core.Constants;
-import com.eshore.gringotts.web.domain.base.entity.SimpleEntity;
+import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity;
import com.eshore.gringotts.web.domain.resource.entity.DataResource;
import com.eshore.gringotts.web.domain.upload.entity.DataFile;
import java.util.Set;
@@ -25,6 +25,9 @@ import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+import org.hibernate.annotations.WhereJoinTable;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
/**
@@ -50,9 +53,12 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@NamedAttributeNode(value = "createdUser"),
@NamedAttributeNode(value = "modifiedUser"),
})
-public class Confirmation extends SimpleEntity {
+@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "confirmation" + " set deleted = true where id = ?")
+@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
+public class Confirmation extends LogicDeleteEntity {
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+ @WhereJoinTable(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
private DataResource target;
private String description;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/DataResource.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/DataResource.java
index edd3e2a..8575f97 100644
--- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/DataResource.java
+++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/DataResource.java
@@ -2,7 +2,7 @@ package com.eshore.gringotts.web.domain.resource.entity;
import com.eshore.gringotts.core.Constants;
import com.eshore.gringotts.web.domain.authentication.entity.Authentication;
-import com.eshore.gringotts.web.domain.base.entity.SimpleEntity;
+import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity;
import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation;
import com.eshore.gringotts.web.domain.resource.entity.format.ResourceFormat;
import com.eshore.gringotts.web.domain.resource.entity.type.ResourceType;
@@ -25,6 +25,8 @@ import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Getter
@@ -48,7 +50,9 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@NamedAttributeNode(value = "createdUser"),
@NamedAttributeNode(value = "modifiedUser"),
})
-public class DataResource extends SimpleEntity {
+@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "data_resource" + " set deleted = true where id = ?")
+@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE)
+public class DataResource extends LogicDeleteEntity {
@Column(nullable = false)
private String name;
private String description;
diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/type/ResourceType.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/type/ResourceType.java
index 51bb4e9..4651e5f 100644
--- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/type/ResourceType.java
+++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/type/ResourceType.java
@@ -1,7 +1,7 @@
package com.eshore.gringotts.web.domain.resource.entity.type;
import com.eshore.gringotts.core.Constants;
-import com.eshore.gringotts.web.domain.base.entity.IdOnlyEntity;
+import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@@ -22,7 +22,7 @@ import lombok.ToString;
@Entity
@Table(name = Constants.TABLE_PREFIX + "resource_type")
@Inheritance(strategy = InheritanceType.JOINED)
-public abstract class ResourceType extends IdOnlyEntity {
+public abstract class ResourceType extends LogicDeleteIdOnlyEntity {
public abstract Type getResourceType();
public enum Type {