# 拓展自定义字段 在`hsweb-system`中提供了一些业务功能,但是有的功能只提供了基本的字段信息.`hsweb`提供了拓展字段而无需修改框架源码的方法. ## 拓展实体类 以拓展组织架构中的组织字段为例 1. 编写实体类,继承需要拓展的实体: ```java package com.myproject.entity; import org.hswebframework.web.entity.organizational.SimpleOrganizationalEntity; public class CustomOrganizationalEntity extends SimpleOrganizationalEntity { /**********拓展字段**********/ private String leader; private String nameEn; private String otherProperty; public String getLeader() { return leader; } public void setLeader(String leader) { this.leader = leader; } public String getNameEn() { return nameEn; } public void setNameEn(String nameEn) { this.nameEn = nameEn; } public String getOtherProperty() { return otherProperty; } public void setOtherProperty(String otherProperty) { this.otherProperty = otherProperty; } } ``` 2. 告诉`hsweb`使用新的实体类 将新的实体类提供给hsweb有3种方式. 第一种:java自带的serviceLoader; 第二种:application.yml配置; 第三种:java类方式配置. 注意: 选择其中任意一种即可. #### serviceLoader方式 创建文件:`META-INF/services/org.hswebframework.web.entity.organizational.OrganizationalEntity`内容: ```text com.myproject.entity.CustomOrganizationalEntity ``` #### application.yml方式 ```yaml hsweb: entity: mappings: - source-base-package: org.hswebframework.web.entity.organizational target-base-package: com.myproject.entity mapping: OrganizationalEntity: CustomOrganizationalEntity ``` #### java类方式 ```java @Component public class CustomEntityMappingCustomizer implements EntityMappingCustomizer { @Override public void customize(MapperEntityFactory entityFactory) { //OrganizationalEntity使用CustomOrganizationalEntity实现 entityFactory.addMapping(OrganizationalEntity.class, MapperEntityFactory.defaultMapper(CustomOrganizationalEntity.class)); } } ``` ## 修改Dao字段映射 使用mybatis作为dao实现时,如果实体类上没有使用jpa注解则需要修改`mapper.xml`的配置来拓展字段. jpa注解和mapper配置各有优势(jpa更简单,但只支持简单的字段.mybatis配置稍微复杂,灵活性更高),请根据实际情况选择合适的方式. #### 修改mapper配置文件方式 1. 创建mapper.xml,可直接复制旧的xml进行修改.旧的xml可在`hsweb-system`中对应的模块进行查找. `com/myproject/mappers/OrganizationalMapper.xml` ```xml delete from s_organization where u_id =#{id} ``` 2. 覆盖`mapper.xml`配置,将`hsweb`自带的配置替换为新的配置. 覆盖方式有2种: application.yml或者java类配置.选择其一即可. application.yml方式: ```yaml mybatis: mapper-location-excludes: classpath*:org/hswebframework/**/OrganizationalMapper.xml #不加载的xml mapper-locations: classpath*:com/myproject/mappers/OrganizationalMapper.xml ``` java类配置方式: ```java @Component //提供给spring才会生效 public class CustomMybatisMapperCustomizer implements MybatisMapperCustomizer { @Override public String[] getExcludes() { return new String[]{ "classpath*:org/hswebframework/**/OrganizationalMapper.xml" }; } @Override public String[] getIncludes() { return new String[]{ "classpath*:com/myproject/mappers/OrganizationalMapper.xml" }; } } ``` #### 使用jpa注解方式 依赖jpa-api: ```xml org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final ``` 在拓展的实体类中使用jpa注解: ```java @Data @Table //此处设置表名是无效的,仅作为一个解析标识 public class CustomUserEntity extends SimpleBindRoleUserEntity { @Column(name = "nick_name") private String nickName; } ``` 注意: 暂时只支持简单的属性。不支持表关联