关于类/属性VS数据库表/列之间的转换

最后更新:2024-05-23 14:51:32 | 状态:未完成
通常情况下类和属性会采用大小驼峰的格式命名,而数据库则采用下划线的格式命名
默认情况下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;
    }
}
参考【示例代码
首页 最近更新 搜索 提交 回复