关于类/属性VS数据库表/列之间的转换
最后更新:2024-05-23 14:51:32
|
状态:未完成
通常情况下类和属性会采用大小驼峰的格式命名,而数据库则采用下划线的格式命名
默认情况下org.anyline.adapter.EntityAdapter接口实现了 类/属性 VS 表/列 之间的默认转换,
但有些数据库设计时并不采用下划线,也用了驼峰格式
如果不是默认的驼峰VS下划线的格式:
1.如果实体类比较少,可以在属性上添加注解
2.也可以自己实现 EntityAdapter接口,主修改其中的Column方法
并通过ConfigTable.IS_DISABLED_DEFAULT_ENTITY_ADAPTER = true 禁用默认转换
默认情况下org.anyline.adapter.EntityAdapter接口实现了 类/属性 VS 表/列 之间的默认转换,
但有些数据库设计时并不采用下划线,也用了驼峰格式
如果不是默认的驼峰VS下划线的格式:
1.如果实体类比较少,可以在属性上添加注解
@Table(name="HR_EMPLOYEE") public class Employee extends BaseEntity{ @GeneratedValue(generator = "disable") //不在java中生成主键 private Long id; @Column(name = "NAME", length = 10) private String nm; @Column(name = "CODE", length = 10) private String workCode; //对应date类型 private LocalDate birthday; //如果属性上没有注解会 会根据 ConfigTable.ENTITY_FIELD_COLUMN_MAP 转换; //默认"camel_"属性小驼峰转下划线 joinYmd > join_ymd private String joinYmd; //这一列在数据库中没有 @Transient private int age; private float salary; //对应数据库blob类型 private byte[] remark; //对应数据库blob类型 private String description; //对应数据库JSON private Department department; private Map map; //这个属性在数据库中不存在 private String tmpCol; // 对应数据库中的json类型 注意这里不要用String接收 否则在返回给前端调用toJson时会把引号 转义 // 应该根据json格式定义一个类,如果不想定义可以用Object类型(会实例化一个LinkedHashMap赋值给Object) private Object other; @Column(name = "type_array", columnDefinition = "text[]") private List<String> types; //工作经历 对应[json]集合类型 private List<Experience> experiences; //职务 对应{json}类型 private Map<String,Post> posts; //头衔 对应[json]类型 数据库中保存["A","B","C"]格式 private List<String> titles; private String[] labels; private int[] scores; //对应varchar 数据库中保存A,B,C格式 private List<String> ctitles; private String[] clabels; private int[] cscores; //对应数据类型point private Double[] workLocation; //对应数据类型point private Point homeLocation; private LocalTime localTime; //多对多关系 一个在多个部门任职 @ManyToMany @JoinTable(name = "HR_EMPLOYEE_DEPARTMENT" //中间关联表 , joinColumns = @JoinColumn(name="EMPLOYEE_ID") //关联表中与当前表关联的外键 , inverseJoinColumns = @JoinColumn(name="DEPARTMENT_ID")) //关联表中与当前表关联的外键 @GeneratedValue(generator = "timestamp") //HR_EMPLOYEE_DEPARTMENT表的主键生成器 private List<Department> departments;//查部门完整信息 @ManyToMany @JoinTable(name = "HR_EMPLOYEE_DEPARTMENT" //中间关联表 , joinColumns = @JoinColumn(name="EMPLOYEE_ID") //关联表中与当前表关联的外键 , inverseJoinColumns = @JoinColumn(name="DEPARTMENT_ID")) //关联表中与当前表关联的外键 @Transient //Transient表示不保存到数据库 private List<Long> departmentIds;//只查部门主键 //考勤记录 @OneToMany(mappedBy = "EMPLOYEE_ID") // 关联表中与当前表关联的外键(这里可以是列名也可以是AttendanceRecord属性名) private List<AttendanceRecord> records = null; // //考勤记录 @OneToMany(mappedBy = "EMPLOYEE_ID") //关联表中与当前表关联的外键(这里可以是列名也可以是AttendanceRecord属性名) private AttendanceRecord[] recordArray = null; //
2.也可以自己实现 EntityAdapter接口,主修改其中的Column方法
并通过ConfigTable.IS_DISABLED_DEFAULT_ENTITY_ADAPTER = true 禁用默认转换
package org.anyline.simple.entity; import org.anyline.adapter.EntityAdapter; import org.anyline.metadata.Column; import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.util.LinkedHashMap; @Component public class EmployeeAdapter implements EntityAdapter { public Class type(){ //只针对Employee类有效,如果针对所有类有效可以把这个方法删除 return Employee.class; } @Override public Column column(Class clazz, Field field, String... annotations) { System.out.println("[class:"+clazz+"][field:"+field+"][在这里实现file>column]"); //这是默认的把驼峰转下划线 return EntityAdapter.super.column(clazz, field, annotations); //可以按实际需求,如原样返回 return new Column(field.getName()); } @Override public LinkedHashMap<String, Column> columns(Class clazz, MODE mode) { LinkedHashMap<String, Column> columns = EntityAdapter.super.columns(clazz, mode); if(mode == MODE.UPDATE){ //UPDATE 时不更新REG_ID columns.remove("REG_ID"); } return columns; } }参考【示例代码】