SpringDataJPA自动建表字段顺序处理

本文旨在留存后用,顺便帮助遇到这个问题的同学

SpringDataJpa默认建表的时候,由于存储选择的是TreeMap,因此会按照字母进行排序,而不会保持原先我们编写的顺序;

字段顺序解决办法重写PropertyContainer改为LinkedHashMap即可;

以下处理基于3.2.4版本,如果重写类出现引用不到的问题可能是模块管理的问题,需重新在项目引入

    implementation ("org.hibernate.common:hibernate-commons-annotations:6.0.6.Final!!")
    implementation ("org.jboss.logging:jboss-logging:3.5.3.Final!!")

package org.hibernate.boot.model.internal;


        final Map<String, XProperty> localAttributeMap;
        if ( !recordComponents.isEmpty() && recordComponents.size() == fields.size() && getters.isEmpty() ) {
            localAttributeMap = new LinkedHashMap<>();
        }
        else {
            //此处修改调整 为LinkedHashMap
            localAttributeMap = new LinkedHashMap<>();
        }

以上解决了字段顺序问题,但我们通常会进行公共字段提取作为基类。

但是这样会造成我们提取的父类字段总是在前,这又不是我们想要的,因此需要进行额外处理;

解决办法重写InheritanceState增加我们自己的逻辑处理

package org.hibernate.boot.model.internal;


public ElementsToProcess postProcess(PersistentClass persistenceClass, EntityBinder entityBinder) {
        getElementsToProcess();
        addMappedSuperClassInMetadata( persistenceClass );
        entityBinder.setPropertyAccessType( accessType );
        //重新排序,按我们自定义逻辑
        reSortElementsToProcess(elementsToProcess);
        return elementsToProcess;
    }

    /**
     * 处理排序问题 将id,tenantId,orgId,userId放在前面 数据放中间 后面跟着 delFlag,createBy,createTime,updateBy,updateTime
     * @param elementsToProcess
     */
    private void reSortElementsToProcess(ElementsToProcess elementsToProcess){
        List<PropertyData> elements = elementsToProcess.getElements();
        if(elementsToProcess!=null && elementsToProcess.getElements().size()>9
            && "id".equals(elements.get(0).getPropertyName())
                && "delFlag".equals(elements.get(4).getPropertyName())
                && "createBy".equals(elements.get(5).getPropertyName())
                && "createTime".equals(elements.get(6).getPropertyName())
                && "updateBy".equals(elements.get(7).getPropertyName())
                && "updateTime".equals(elements.get(8).getPropertyName())
        ){
            ArrayList<PropertyData> sortElements = new ArrayList<>();
            sortElements.addAll(elements.subList(0, 4));
            sortElements.addAll(elements.subList(9, elements.size()));
            sortElements.addAll(elements.subList(4, 9));
            elements.clear();
            elements.addAll(sortElements);
        }
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值