초기 테이블 생성을 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--) {
// ...
}
// ...
}
// ...
}