我有一個全局命名策略,但對於一些我希望使用不同實體的實體。在jpa或hibernate中可能嗎?每個實體的休眠命名策略
澄清:我不想使用@Table(name =「xxx」)和@Column(name =「xxx」)。我在詢問有關命名策略組件(例如在此處描述:Hibernate naming strategy)。這是推斷列名和表名的組件
我有一個全局命名策略,但對於一些我希望使用不同實體的實體。在jpa或hibernate中可能嗎?每個實體的休眠命名策略
澄清:我不想使用@Table(name =「xxx」)和@Column(name =「xxx」)。我在詢問有關命名策略組件(例如在此處描述:Hibernate naming strategy)。這是推斷列名和表名的組件
我在Hibernate源代碼中看不到方法。 EntityBinder
提供使用ObjectNameNormalizer.NamingStrategyHelper
的名稱,該名稱從Configuration.namingStrategy
(全球一個)或從複雜路徑(MetadataImpl
)獲得命名策略並且無處可用(無用法)。
因此,您可能會用手動覆蓋字段名稱。我甚至都沒有看到明確的方式來獲得關於該領域的背景知識,所以我認爲即使是一個裂腦命名策略看起來也是不可能的。
更新:看到@ anthony-accioly的回答後,我想我最後一句話可能是錯的。所以,我測試了它作爲一個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的數據DAO如下
public interface SomeEntityDao extends CrudRepository<SomeEntity, String> {
}
和集成測試如下
@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);
}
}
如下
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;
}
}
我把斷點放在ImprovedNamingStrategy
中,classToTableName()
被稱爲「SomeEntity」,propertyToColumnName()
被稱爲「someField」。
換句話說,包信息沒有被傳入,所以至少在這個設置中,它不能用於根據包名應用不同的命名策略。
「@Entity(name =」yourNameHere「)'?或者你還指定了什麼命名策略?請澄清。 – Zhedar
通過命名策略我的意思是'避免手動提供列名'的方法:http://stackoverflow.com/questions/19146246/hibernate-naming-strategy – piotrek
piotrek,我想這裏的每個人的觀點是。對默認用例使用全局命名策略,並使用註釋覆蓋非默認情況。如果比實施自己的[NamingStrategy]更清潔(http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/cfg/NamingStrategy.html)。 –