Estratégia de nomenclatura personalizada do Hibernate

Por demanda do cliente, eu precisei mudar a forma como o Hibernate nomeia as colunas de chave estrangeira.

Por padrão, o Hibernate adiciona a coluna referenciada como um sufixo, por exemplo, entity_id , mas eu precisava adicionar a coluna referenciada como um prefixo para que fosse nomeada como id_entity .

Em vez de anotar todos os campos com @Columne usar a namepropriedade, decidi customizar a forma como o Hibernate nomeia essas colunas. Para fazer isso, preciso criar uma estratégia de nomenclatura personalizada.

No Hibernate 4.3.5. você precisa criar um org.hibernate.cfg.naming.NamingStrategyDelegator e um org.hibernate.cfg.naming.NamingStrategyDelegateAdapter e declará-lo no arquivo persistence.xml .

Então, aqui está como eu resolvi:

import java.io.Serializable;

import org.hibernate.cfg.naming.HbmNamingStrategyDelegate;
import org.hibernate.cfg.naming.NamingStrategyDelegate;
import org.hibernate.cfg.naming.NamingStrategyDelegator;

public class CustomNamingStrategyDelegator implements NamingStrategyDelegator, Serializable {

private static final long serialVersionUID = -1880672539574785139L;

public static final NamingStrategyDelegator DEFAULT_INSTANCE = new CustomNamingStrategyDelegator();

private final NamingStrategyDelegate hbmNamingStrategyDelegate;
private final NamingStrategyDelegate jpaNamingStrategyDelegate;

public CustomNamingStrategyDelegator() {
this( new HbmNamingStrategyDelegate(), new CustomJpaNamingStrategyDelegate() );
}

protected CustomNamingStrategyDelegator( NamingStrategyDelegate hbmNamingStrategyDelegate, NamingStrategyDelegate jpaNamingStrategyDelegate ) {
this.hbmNamingStrategyDelegate = hbmNamingStrategyDelegate;
this.jpaNamingStrategyDelegate = jpaNamingStrategyDelegate;
}

@Override
public NamingStrategyDelegate getNamingStrategyDelegate( boolean isHbm ) {
return isHbm ? hbmNamingStrategyDelegate : jpaNamingStrategyDelegate;
}

}
import org.hibernate.AssertionFailure;
import org.hibernate.cfg.naming.JpaNamingStrategyDelegate;
import org.hibernate.internal.util.StringHelper;

public class CustomJpaNamingStrategyDelegate extends JpaNamingStrategyDelegate {

private static final long serialVersionUID = 1294347082667342357L;

@Override
public String determineImplicitEntityAssociationJoinColumnName( String propertyEntityName, String propertyJpaEntityName, String propertyTableName, String referencedColumnName, String referencingPropertyName ) {

final String header;
if ( referencingPropertyName == null ) {
header
= determineEntityNameToUse( propertyEntityName, propertyJpaEntityName );
} else {
header
= StringHelper.unqualify( referencingPropertyName );
}
if ( header == null ) {
throw new AssertionFailure( "propertyJpaEntityName and referencingPropertyName cannot both be empty." );
}
return toPhysicalColumnName( referencedColumnName + "_" + header );
}

private String determineEntityNameToUse( String entityName, String jpaEntityName ) {
if ( StringHelper.isNotEmpty( jpaEntityName ) ) {
return jpaEntityName;
} else {
return StringHelper.unqualifyEntityName( entityName );
}
}

}

Em seguida, declare-o em persistence.xml

<properties>
...


<property name="hibernate.ejb.naming_strategy_delegator" value="package.CustomNamingStrategyDelegator"/>

...

</properties>