2014-03-25 50 views
5

我有一個全局命名策略,但對於一些我希望使用不同實體的實體。在jpa或hibernate中可能嗎?每個實體的休眠命名策略

澄清:我不想使用@Table(name =「xxx」)和@Column(name =「xxx」)。我在詢問有關命名策略組件(例如在此處描述:Hibernate naming strategy)。這是推斷列名和表名的組件

+0

「@Entity(name =」yourNameHere「)'?或者你還指定了什麼命名策略?請澄清。 – Zhedar

+0

通過命名策略我的意思是'避免手動提供列名'的方法:http://stackoverflow.com/questions/19146246/hibernate-naming-strategy – piotrek

+0

piotrek,我想這裏的每個人的觀點是。對默認用例使用全局命名策略,並使用註釋覆蓋非默認情況。如果比實施自己的[NamingStrategy]更清潔(http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/cfg/NamingStrategy.html)。 –

回答

2

我在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」。

換句話說,包信息沒有被傳入,所以至少在這個設置中,它不能用於根據包名應用不同的命名策略。

-1

是的。您可以使用@Table(name = ...)和@Column(name = ...)這樣的JPA註釋來指定實體的自定義名稱。因爲這是JPA註釋,它也可以在休眠狀態下工作。

+0

我知道我可以手動命名這些字段。但我是否可以通過使用不同的命名策略來避免它 – piotrek

+0

因此,您實際上不希望命名策略是在標題中描述的每個實體,而是一組命名策略。 – Ben