diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 67c191f..62ac42e 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -8,6 +8,7 @@ + diff --git a/src/main/java/com/lanyuanxiaoyao/server/configuration/Constants.java b/src/main/java/com/lanyuanxiaoyao/server/configuration/Constants.java new file mode 100644 index 0000000..2c24ccc --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/configuration/Constants.java @@ -0,0 +1,9 @@ +package com.lanyuanxiaoyao.server.configuration; + +/** + * @author lanyuanxiaoyao + * @version 20250327 + */ +public interface Constants { + String DATABASE_TABLE_PREFIX = "system_"; +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/configuration/database/SnowflakeIdGenerator.java b/src/main/java/com/lanyuanxiaoyao/server/configuration/database/SnowflakeId.java similarity index 66% rename from src/main/java/com/lanyuanxiaoyao/server/configuration/database/SnowflakeIdGenerator.java rename to src/main/java/com/lanyuanxiaoyao/server/configuration/database/SnowflakeId.java index f6bc1e5..54f93db 100644 --- a/src/main/java/com/lanyuanxiaoyao/server/configuration/database/SnowflakeIdGenerator.java +++ b/src/main/java/com/lanyuanxiaoyao/server/configuration/database/SnowflakeId.java @@ -1,11 +1,17 @@ package com.lanyuanxiaoyao.server.configuration.database; -import java.io.Serializable; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; import java.time.Instant; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.annotations.IdGeneratorType; +import org.hibernate.annotations.ValueGenerationType; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.IdentifierGenerator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * 使用雪花算法作为ID生成器 @@ -13,16 +19,24 @@ import org.slf4j.LoggerFactory; * @author lanyuanxiaoyao * @date 2024-11-14 */ -public class SnowflakeIdGenerator implements IdentifierGenerator { - private static final Logger logger = LoggerFactory.getLogger(SnowflakeIdGenerator.class); +@Slf4j +public class SnowflakeId { + @IdGeneratorType(IdGenerator.class) + @ValueGenerationType(generatedBy = IdGenerator.class) + @Retention(RUNTIME) + @Target({FIELD, METHOD}) + public @interface Generator { + } - @Override - public Serializable generate(SharedSessionContractImplementor session, Object object) { - try { - return Snowflake.next(); - } catch (Exception e) { - logger.error("Generate snowflake id failed", e); - throw new RuntimeException(e); + public static final class IdGenerator implements IdentifierGenerator { + @Override + public Object generate(SharedSessionContractImplementor session, Object object) { + try { + return Snowflake.next(); + } catch (Exception e) { + log.error("Generate snowflake id failed", e); + throw new RuntimeException(e); + } } } diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/Department.java b/src/main/java/com/lanyuanxiaoyao/server/entity/Department.java new file mode 100644 index 0000000..d8ccd9d --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/Department.java @@ -0,0 +1,45 @@ +package com.lanyuanxiaoyao.server.entity; + +import com.lanyuanxiaoyao.server.configuration.Constants; +import com.lanyuanxiaoyao.server.configuration.database.SnowflakeId; +import jakarta.persistence.ConstraintMode; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.Set; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * 组织 + * + * @author lanyuanxiaoyao + * @version 20250327 + */ +@Getter +@Setter +@ToString +@Entity +@Table(name = Constants.DATABASE_TABLE_PREFIX + "department") +public class Department { + @Id + @SnowflakeId.Generator + private Long departmentId; + private String departmentName; + + @ManyToOne + @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Organization organization; + + @ManyToOne + private Department parent; + @OneToMany(fetch = FetchType.LAZY, mappedBy = "departmentParent") + @ToString.Exclude + private Set children; +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/Organization.java b/src/main/java/com/lanyuanxiaoyao/server/entity/Organization.java new file mode 100644 index 0000000..000d3e6 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/Organization.java @@ -0,0 +1,35 @@ +package com.lanyuanxiaoyao.server.entity; + +import com.lanyuanxiaoyao.server.configuration.Constants; +import com.lanyuanxiaoyao.server.configuration.database.SnowflakeId; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.Set; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * 组织 + * + * @author lanyuanxiaoyao + * @version 20250327 + */ +@Getter +@Setter +@ToString +@Entity +@Table(name = Constants.DATABASE_TABLE_PREFIX + "organization") +public class Organization { + @Id + @SnowflakeId.Generator + private Long organizationId; + private String organizationName; + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "organization") + @ToString.Exclude + private Set departments; +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/User.java b/src/main/java/com/lanyuanxiaoyao/server/entity/User.java new file mode 100644 index 0000000..c77fa14 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/User.java @@ -0,0 +1,30 @@ +package com.lanyuanxiaoyao.server.entity; + +import com.lanyuanxiaoyao.server.configuration.Constants; +import com.lanyuanxiaoyao.server.configuration.database.SnowflakeId; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * 用户 + * + * @author lanyuanxiaoyao + * @version 20250327 + */ +@Getter +@Setter +@ToString +@Entity +@Table(name = Constants.DATABASE_TABLE_PREFIX + "user") +public class User { + @Id + @SnowflakeId.Generator + private Long userId; + private String userCode; + private String userNickName; + private String userSecret; +}