hibernate
맞춤 명명 전략
수색…
사용자 지정 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 명명 규칙을 적용하기 위해 toPhysicalTableName
및 toPhysicalColumnName
메서드의 기본 동작을 재정의했습니다.
사용자 정의 구현을 사용하려면 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")