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 @Column
e usar a name
propriedade, 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>