pio*_*rek 6 java hibernate jpa
我有一个全局命名策略,但对于一些实体,我想使用另一个.有可能在jpa或hibernate?
澄清:我不想使用@Table(name ="xxx")或@Column(name ="xxx").我问的是命名策略组件(例如在这里描述:Hibernate命名策略).这是一个为您推断列名和表名的组件
我在 Hibernate 源代码中没有看到任何方法。EntityBinder正在使用名称,它从(全局的)或从一条经过且无处着陆的复杂路径(无用法)ObjectNameNormalizer.NamingStrategyHelper获取命名策略。Configuration.namingStrategyMetadataImpl
因此,您可能会陷入手动覆盖字段名称的困境。我什至没有看到一种明显的方法来获取该领域的上下文,所以我认为即使是裂脑命名策略看起来也是不可能的。
更新:看到@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;
}
}
Run Code Online (Sandbox Code Playgroud)
如下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;
}
...
Run Code Online (Sandbox Code Playgroud)
一个 Spring Data DAO 如下
public interface SomeEntityDao extends CrudRepository<SomeEntity, String> {
}
Run Code Online (Sandbox Code Playgroud)
和集成测试如下
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在 中放置了断点ImprovedNamingStrategy,并classToTableName()用“SomeEntity”调用,并propertyToColumnName()用“someField”调用。
换句话说,包信息没有被传入,因此至少在此设置中,它不能用于根据包名称应用不同的命名策略。
| 归档时间: |
|
| 查看次数: |
4455 次 |
| 最近记录: |