重构模型类包结构,将模型类按功能模块划分到不同的子包中。优化序列化处理,为VO类添加serialVersionUID并实现Serializable接口。移除部分冗余的serialVersionUID字段,简化模型类代码。同时修复UITools中空值处理的问题,并更新pom版本至0.0.100-SNAPSHOT。 - 将模型类按功能模块划分到ds子包中 - 为VO类添加序列化支持 - 移除冗余的serialVersionUID字段 - 修复UITools空值处理问题 - 更新项目版本号
3.4 KiB
3.4 KiB
实体类规则
1. 目录结构
- 实体类统一放置在
common/src/main/java/com/ecep/contract/model/目录下 - 按业务领域组织,不使用子目录
2. 命名规范
- 类名:使用驼峰命名法,首字母大写,如
Contract.java、Company.java - 表名:通常与类名对应,使用大写字母和下划线,如
CONTRACT、COMPANY - 字段名:使用小写字母和驼峰命名法,对应数据库中使用大写字母和下划线的列名
3. 继承与接口实现
- 实体类通常实现以下接口:
IdentityEntity:提供主键ID的getter/setter及equals方法实现BasedEntity:提供toPrettyString()方法NamedEntity:提供name属性的getter/setter(适用于有名称的实体)Voable<T>:提供toVo()方法,用于将实体转换为对应的VO对象- 特定领域接口:如
CompanyBasedEntity、ContractBasedEntity、ProjectBasedEntity等
4. 注解规范
- JPA注解:
@Entity:标记为实体类@Table(name = "表名", schema = "数据库名"):指定对应的数据库表和数据库@Id:标记主键字段@GeneratedValue(strategy = GenerationType.IDENTITY):指定主键生成策略@Column(name = "列名", nullable = false, length = 长度):指定字段对应的数据库列属性@ManyToOne(fetch = FetchType.LAZY):指定多对一关系,通常使用LAZY加载@JoinColumn(name = "外键列名"):指定外键列@Enumerated(EnumType.ORDINAL):指定枚举类型的存储方式@Lob:指定大对象类型@Version:指定乐观锁版本字段
- Lombok注解:
@Getter:生成getter方法@Setter:生成setter方法@ToString:生成toString方法,复杂关联对象可使用@ToString.Exclude排除
5. 字段规范
- 主键字段:
- 类型:
Integer - 命名:
id - 注解:
@Id、@GeneratedValue(strategy = GenerationType.IDENTITY)
- 类型:
- 其他字段:
- 基本类型:使用Java包装类型(如
Integer、Boolean)而不是原始类型 - 时间类型:使用
java.time.LocalDate或java.time.LocalDateTime - 布尔类型:使用
boolean或Boolean,对应数据库中的BIT或BOOLEAN类型 - 关联关系:使用
@ManyToOne、@OneToMany等注解定义
- 基本类型:使用Java包装类型(如
6. 方法规范
equals方法:通常使用HibernateProxyUtils工具类处理代理对象的比较hashCode方法:通常使用HibernateProxyUtils.hashCode(this)实现toVo方法:实现Voable接口,将实体转换为对应的VO对象toString方法:通常使用Lombok的@ToString注解生成
7. 注释规范
- 类注释:使用JavaDoc格式,描述实体类的用途
- 字段注释:使用JavaDoc格式,描述字段的含义、数据来源、取值范围等
- 对于特殊字段,可包含详细的说明表格或示例
8. 序列化规范
- 重要:实体类不包含
Serializable接口和serialVersionUID字段 - 序列化相关功能由对应的VO类实现
9. 最佳实践
- 实体类应保持简洁,只包含数据和基本的数据访问方法
- 业务逻辑应在服务层实现
- 复杂的查询逻辑应在Repository层或通过Specification实现
- 避免在实体类中使用复杂的计算逻辑
- 对于多对多关系,建议使用中间表和两个一对多关系实现
- 关联关系应使用懒加载(LAZY)以提高性能