JPA(Hibernate) HBM2DDL 컬럼 순서 지정 방법

조제·2023년 4월 7일
0

초기 테이블 생성을 hbm2ddl = create 를 이용해서 진행할 경우, 하이버네이트는 엔티티의 컬럼들을 알파벳 순(PK는 앞쪽에 생성)으로 생성합니다. 알파벳 순이 아닌 자바 소스내에서 Entity에 적힌 순서대로 생성하는 방법을 적용해보았습니다.

컬럼 순서 지정 방법


hibernate-core 라이브러리에서 PropertyContainer 클래스를 찾은 후 복사합니다.

root 폴더에 org.hibernate.cfg 패키지를 만든 후 복사한 PropertyContainer 클래스를 붙여넣습니다.

PropertyContainer 클래스 내에서 TreeMap을 LinkedHashMap으로 교체합니다.

public class PropertyContainer {
	// ...
    PropertyContainer(XClass clazz, XClass entityAtStake, AccessType defaultClassLevelAccessType) {
        // ...
        // 수정 전
//      TreeMap<String, XProperty> localAttributeMap = new TreeMap();
		// 수정 후
        LinkedHashMap<String, XProperty> localAttributeMap = new LinkedHashMap();
        // ...
    }
	// ...
    // 수정 전
//  private static void collectPersistentAttributesUsingLocalAccessType(XClass xClass, TreeMap<String, XProperty> persistentAttributeMap, Map<String, XProperty> persistentAttributesFromGetters, List<XProperty> fields, List<XProperty> getters) {
	// 수정 후
    private static void collectPersistentAttributesUsingLocalAccessType(XClass xClass, LinkedHashMap<String, XProperty> persistentAttributeMap, Map<String, XProperty> persistentAttributesFromGetters, List<XProperty> fields, List<XProperty> getters) {
        // ...
    }

	// 수정 전
//  private static void collectPersistentAttributesUsingClassLevelAccessType(XClass xClass, AccessType classLevelAccessType, TreeMap<String, XProperty> persistentAttributeMap, Map<String, XProperty> persistentAttributesFromGetters, List<XProperty> fields, List<XProperty> getters) {
	private static void collectPersistentAttributesUsingClassLevelAccessType(XClass xClass, AccessType classLevelAccessType, LinkedHashMap<String, XProperty> persistentAttributeMap, Map<String, XProperty> persistentAttributesFromGetters, List<XProperty> fields, List<XProperty> getters) {
        // ...
    }
	// ...
}

실행 후 자바 소스내에서 작성한 Entity의 컬럼 순서대로 생성된 걸 확인할 수 있습니다.

상속 클래스에도 적용


상속 클래스에도 적용하려면 추가로 InheritanceState.class 를 추가해줘야 합니다.
hibernate-core 라이브러리에서 InheritanceState 클래스를 찾은 후 root 폴더에 org.hibernate.cfg 패키지에 붙여넣습니다.

InheritanceState 클래스를 아래처럼 수정하면 됩니다.

public class InheritanceState {
    // ...
    private void getMappedSuperclassesTillNextEntityOrdered() {
        XClass currentClassInHierarchy = this.clazz;
        InheritanceState superclassState;
        do {
            // 수정 전
//          this.classesToProcessForMappedSuperclass.add(0, currentClassInHierarchy);
			// 수정 후
            this.classesToProcessForMappedSuperclass.add(currentClassInHierarchy);
            // ...
        } while(superclassState != null && superclassState.isEmbeddableSuperclass());

    }

    private void addMappedSuperClassInMetadata(PersistentClass persistentClass) {
        org.hibernate.mapping.MappedSuperclass mappedSuperclass = null;
        InheritanceState superEntityState = getInheritanceStateOfSuperEntity(this.clazz, this.inheritanceStatePerClass);
        PersistentClass superEntity = superEntityState != null ? this.buildingContext.getMetadataCollector().getEntityBinding(superEntityState.getClazz().getName()) : null;
        int lastMappedSuperclass = this.classesToProcessForMappedSuperclass.size() - 1;
	
    	// 수정 전
//      for(int index = 0; index < lastMappedSuperclass; ++index) {
		for (int index = lastMappedSuperclass; index > 0; index--) {
            // ...
        }
		// ...
    }
	// ...
}

참고 : https://stackoverflow.com/a/65731578

profile
조제

0개의 댓글