我没有在Hibernate源代码中看到一种方法. EntityBinder使用ObjectNameNormalizer.NamingStrategyHelper提供名称,它从Configuration.namingStrategy(全局一个)获取命名策略,或从复杂路径获取,该路径通过MetadataImpl并且无处可去(没有用法).
因此,您可能会手动覆盖覆盖字段名称.我甚至没有看到明显的方法来获得关于该领域的背景,所以我认为即使是一种分裂脑命名策略看起来也是不可能的.
更新:看到@ anthony-accioly的答案后,我以为我最后一句可能是错的.所以我测试了如下
package internal.sandbox.domain;
@Entity
public class SomeEntity {
private String id;
private String someField;
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSomeField() {
return someField;
}
public void setSomeField(String someField) {
this.someField = someField;
}
}
使用JpaConfiguration如下
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("internal.sandbox.dao")
@Import(DataSourceConfiguration.class)
public class JpaConfiguration {
@Bean
@Autowired
public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(DataSource dataSource) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQL82Dialect");
vendorAdapter.setDatabase(Database.POSTGRESQL);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("internal.sandbox"); // note, no ".domain"
factory.setDataSource(dataSource);
Properties properties = new Properties();
properties.setProperty("hibernate.cache.use_second_level_cache", "false");
properties.setProperty("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
factory.setJpaProperties(properties);
return factory;
}
...
Spring Data DAO如下
public interface SomeEntityDao extends CrudRepository {
}
以及如下的集成测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ApplicationConfiguration.class, JpaConfiguration.class})
public class SomeEntityDaoIntegrationTests {
@Autowired
private SomeEntityDao someEntityDao;
@Test
public void testSave() {
SomeEntity someEntity = new SomeEntity();
someEntity.setId("foo");
someEntity.setSomeField("bar");
this.someEntityDao.save(someEntity);
}
}
我在ImprovedNamingStrategy中添加了断点,并使用“SomeEntity”调用了classToTableName(),并使用“someField”调用了propertyToColumnName().
换句话说,包信息未被传入,因此至少在此设置中,它不能用于基于包名应用不同的命名策略.