diff --git a/pom.xml b/pom.xml index eab5fa38..0a6845e9 100644 --- a/pom.xml +++ b/pom.xml @@ -196,6 +196,26 @@ org.hibernate.orm hibernate-core + + + org.hibernate.orm + hibernate-jcache + + + + org.redisson + + + redisson-hibernate-6 + 3.23.4 + + + + org.redisson + redisson-spring-boot-starter + 3.23.4 + + com.alibaba diff --git a/src/main/java/cn/lihongjie/coal/permission/entity/PermissionEntity.java b/src/main/java/cn/lihongjie/coal/permission/entity/PermissionEntity.java index e5a5e2a3..1303f0ad 100644 --- a/src/main/java/cn/lihongjie/coal/permission/entity/PermissionEntity.java +++ b/src/main/java/cn/lihongjie/coal/permission/entity/PermissionEntity.java @@ -2,10 +2,12 @@ package cn.lihongjie.coal.permission.entity; import cn.lihongjie.coal.resource.entity.ResourceEntity; import cn.lihongjie.coal.base.entity.CommonEntity; +import jakarta.persistence.Cacheable; import jakarta.persistence.Entity; import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import lombok.Data; +import org.hibernate.annotations.Cache; import org.hibernate.annotations.Comment; import java.util.List; @@ -13,12 +15,14 @@ import java.util.List; @Data @Entity @Comment("权限") +@Cacheable public class PermissionEntity extends CommonEntity { @ManyToMany() @JoinTable(foreignKey = @jakarta.persistence.ForeignKey(name = "none" , value = jakarta.persistence.ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @jakarta.persistence.ForeignKey(name = "none" , value = jakarta.persistence.ConstraintMode.NO_CONSTRAINT)) + @Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE) private List resources; diff --git a/src/main/java/cn/lihongjie/coal/resource/entity/ResourceEntity.java b/src/main/java/cn/lihongjie/coal/resource/entity/ResourceEntity.java index 98679d37..cea1d0da 100644 --- a/src/main/java/cn/lihongjie/coal/resource/entity/ResourceEntity.java +++ b/src/main/java/cn/lihongjie/coal/resource/entity/ResourceEntity.java @@ -18,13 +18,16 @@ import java.util.List; @Comment("资源") @Slf4j @Table(indexes = {@Index(name = "idx_resource_type_code", columnList = "type,code", unique = true)}) +@Cacheable public class ResourceEntity extends CommonEntity { @ManyToMany(mappedBy = "resources") + @org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE) private List permissions; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) + @org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE) private List children; @ManyToOne diff --git a/src/main/java/cn/lihongjie/coal/role/entity/RoleEntity.java b/src/main/java/cn/lihongjie/coal/role/entity/RoleEntity.java index b943693a..0c69f496 100644 --- a/src/main/java/cn/lihongjie/coal/role/entity/RoleEntity.java +++ b/src/main/java/cn/lihongjie/coal/role/entity/RoleEntity.java @@ -1,28 +1,28 @@ package cn.lihongjie.coal.role.entity; -import cn.lihongjie.coal.permission.entity.PermissionEntity; import cn.lihongjie.coal.base.entity.OrgCommonEntity; +import cn.lihongjie.coal.permission.entity.PermissionEntity; import cn.lihongjie.coal.user.entity.UserEntity; -import com.fasterxml.jackson.annotation.JsonBackReference; +import jakarta.persistence.Cacheable; import jakarta.persistence.Entity; import jakarta.persistence.ManyToMany; import lombok.Data; +import org.hibernate.annotations.Cache; import java.util.List; @Entity @Data - +@Cacheable public class RoleEntity extends OrgCommonEntity { - - @ManyToMany(mappedBy = "roles") - @JsonBackReference + @Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE) private List users; @ManyToMany + @Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE) private List permissions; } diff --git a/src/main/java/cn/lihongjie/coal/spring/config/HibernateConfig.java b/src/main/java/cn/lihongjie/coal/spring/config/HibernateConfig.java index 06014e62..9ae28e48 100644 --- a/src/main/java/cn/lihongjie/coal/spring/config/HibernateConfig.java +++ b/src/main/java/cn/lihongjie/coal/spring/config/HibernateConfig.java @@ -5,6 +5,7 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.cfg.AvailableSettings; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -15,13 +16,32 @@ import java.util.Map; public class HibernateConfig { + @Autowired + MyRedissonRegionFactory myRedissonRegionFactory; + + @Bean HibernatePropertiesCustomizer hibernatePropertiesCustomizer() { return new HibernatePropertiesCustomizer() { @Override public void customize(Map hibernateProperties) { hibernateProperties.put(AvailableSettings.DIALECT, MyPostgreSQLDialect.class.getCanonicalName()); + // + hibernateProperties.put("hibernate.cache.region.factory_class", myRedissonRegionFactory); // hibernateProperties.put(AvailableSettings.SCHEMA_MANAGEMENT_TOOL, MultithreadHibernateSchemaManagementTool.class.getCanonicalName()); + + /** + * + * + * + * + * + * + */ + hibernateProperties.put("hibernate.cache.use_second_level_cache", "true"); + hibernateProperties.put("hibernate.cache.use_query_cache", "false"); + hibernateProperties.put("hibernate.cache.redisson.fallback", "true"); + } }; diff --git a/src/main/java/cn/lihongjie/coal/spring/config/MyRedissonRegionFactory.java b/src/main/java/cn/lihongjie/coal/spring/config/MyRedissonRegionFactory.java new file mode 100644 index 00000000..98503d1d --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/spring/config/MyRedissonRegionFactory.java @@ -0,0 +1,21 @@ +package cn.lihongjie.coal.spring.config; + +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.redisson.api.RedissonClient; +import org.redisson.hibernate.RedissonRegionFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +public class MyRedissonRegionFactory extends RedissonRegionFactory { + + @Autowired + RedissonClient redissonClient; + + @Override + protected RedissonClient createRedissonClient(StandardServiceRegistry registry, Map properties) { + return redissonClient; + } +} diff --git a/src/main/java/cn/lihongjie/coal/user/entity/UserEntity.java b/src/main/java/cn/lihongjie/coal/user/entity/UserEntity.java index e97809f9..692988de 100644 --- a/src/main/java/cn/lihongjie/coal/user/entity/UserEntity.java +++ b/src/main/java/cn/lihongjie/coal/user/entity/UserEntity.java @@ -2,16 +2,19 @@ package cn.lihongjie.coal.user.entity; import cn.lihongjie.coal.role.entity.RoleEntity; import cn.lihongjie.coal.base.entity.OrgCommonEntity; +import jakarta.persistence.Cacheable; import jakarta.persistence.Entity; import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import lombok.Data; +import org.hibernate.annotations.Cache; import org.hibernate.annotations.Comment; import java.util.List; @Data @Entity +@Cacheable public class UserEntity extends OrgCommonEntity { @@ -31,9 +34,11 @@ public class UserEntity extends OrgCommonEntity { @ManyToMany() @JoinTable(indexes = {@jakarta.persistence.Index(name = "idx_user_roles_users_id", columnList = "users_id"), @jakarta.persistence.Index(name = "idx_user_roles_roles_id", columnList = "roles_id")}) + @Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE) private List roles; + @Comment("机构管理员标识") private Boolean orgAdmin;