gpt4 book ai didi

java - 每个实体的 Hibernate 命名策略

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:10 25 4
gpt4 key购买 nike

我有一个全局命名策略,但对于一些实体我想使用不同的命名策略。在 jpa 或 hibernate 中可以吗?

澄清:我不想使用@Table(name="xxx") 或@Column(name="xxx")。我问的是命名策略组件(例如此处描述:Hibernate naming strategy)。这是一个为您推断列名和表名的组件

最佳答案

我在 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<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);
}
}

我在 ImprovedNamingStrategy 中放置了断点,classToTableName() 是用“SomeEntity”调用的,propertyToColumnName() 是用“someField”调用的".

换句话说,包信息没有传入,所以至少在这个设置中,它不能用于根据包名称应用不同的命名策略。

关于java - 每个实体的 Hibernate 命名策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com