수색…


사용자 지정 ImplicitNamingStrategy 만들기 및 사용

사용자 정의 ImplicitNamingStrategy 생성하면 Hibernate가 외래 키, 고유 키, 식별자 열, 기본 열 등을 포함하여 명시 적으로 이름이 지정되지 않은 Entity 특성에 이름을 할당하는 방법을 조정할 수 있습니다.

예를 들어, Hibernate는 기본적으로 해싱 된 외래 키를 생성하고 다음과 유사하게 보입니다.

FKe6hidh4u0qh8y1ijy59s2ee6m

이것은 종종 문제가되지 않지만 다음과 같이 이름이 더 잘 설명되기를 바랍니다.

FK_asset_tenant

이 작업은 사용자 지정 ImplicitNamingStrategy 사용하여 쉽게 수행 할 수 있습니다.

이 예제는 ImplicitNamingStrategyJpaCompliantImpl 확장하지만 원하는 경우 ImplicitNamingStrategy 를 구현하도록 선택할 수 있습니다.

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.ImplicitForeignKeyNameSource;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;

public class CustomNamingStrategy extends ImplicitNamingStrategyJpaCompliantImpl {

    @Override
    public Identifier determineForeignKeyName(ImplicitForeignKeyNameSource source) {
        return toIdentifier("FK_" + source.getTableName().getCanonicalName() + "_" + source.getReferencedTableName().getCanonicalName(), source.getBuildingContext());
    }

}

ImplicitNamingStrategy 가 사용할 ImplicitNamingStrategy 를 Hibernate에게 알려주기 위해서, persistence.xml 또는 hibernate.cfg.xml 파일에 hibernate.implicit_naming_strategy 속성을 아래와 같이 정의한다.

<property name="hibernate.implicit_naming_strategy"
                  value="com.example.foo.bar.CustomNamingStrategy"/>

또는 아래와 같이 hibernate.properties 파일에 속성을 지정할 수 있습니다 :

hibernate.implicit_naming_strategy=com.example.foo.bar.CustomNamingStrategy

이 예제에서 명시 적으로 정의 된 name 이없는 모든 외래 키는 이제 CustomNamingStrategy 에서 이름을 가져 CustomNamingStrategy .

사용자 지정 실제 이름 지정 전략

엔티티를 데이터베이스 테이블 이름에 매핑 할 때 @Table 주석을 사용합니다. 그러나 우리가 데이터베이스 테이블 이름에 대한 명명 규칙을 가지고 있다면, Hibernate가 엔티티의 이름을 기반으로 테이블 이름을 계산하도록 지정하기 위해 @Table 주석을 사용하여 이름을 명시하지 않고 사용자 지정 실제 명명 전략을 구현할 수 있습니다. 속성 및 열 매핑도 동일합니다.

예를 들어, 엔티티 이름은 다음과 같습니다.

ApplicationEventLog

테이블 이름은 다음과 같습니다.

application_event_log

우리의 물리적 이름 지정 전략은 낙타의 경우 엔티티 이름을 snake case 인 db 테이블 이름으로 변환해야합니다. 우리는 최대 절전 모드의 PhysicalNamingStrategyStandardImpl 을 확장함으로써 이것을 달성 할 수 있습니다 :

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class PhysicalNamingStrategyImpl extends PhysicalNamingStrategyStandardImpl {

    private static final long serialVersionUID = 1L;
    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(addUnderscores(name.getText()), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(addUnderscores(name.getText()), name.isQuoted());
    }

    protected static String addUnderscores(String name) {
        final StringBuilder buf = new StringBuilder(name);
        for (int i = 1; i < buf.length() - 1; i++) {
            if (Character.isLowerCase(buf.charAt(i - 1)) &&
                    Character.isUpperCase(buf.charAt(i)) &&
                    Character.isLowerCase(buf.charAt(i + 1))) {
                buf.insert(i++, '_');
            }
        }
        return buf.toString().toLowerCase(Locale.ROOT);
    }
}

db 명명 규칙을 적용하기 위해 toPhysicalTableNametoPhysicalColumnName 메서드의 기본 동작을 재정의했습니다.

사용자 정의 구현을 사용하려면 hibernate.physical_naming_strategy 속성을 정의하고 PhysicalNamingStrategyImpl 클래스의 이름을 지정해야합니다.

hibernate.physical_naming_strategy=com.example.foo.bar.PhysicalNamingStrategyImpl

이 방법으로 @Table@Column 주석에서 코드를 줄일 수 있으므로 엔티티 클래스는 다음과 같습니다.

@Entity
public class ApplicationEventLog {
    private Date startTimestamp;
    private String logUser;
    private Integer eventSuccess;

    @Column(name="finish_dtl")
    private String finishDetails;
}

db 테이블에 올바르게 매핑됩니다.

CREATE TABLE application_event_log (
  ...
  start_timestamp timestamp,
  log_user varchar(255),
  event_success int(11),
  finish_dtl varchar(2000),
  ...
)

위의 예제에서 볼 수 있듯이 우리가 일반적인 이름 지정 규칙에 따라 db 객체의 이름을 명시 적으로 지정할 수는 있습니다. @Column(name="finish_dtl")



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow