我有简单的spring-jpa配置,我配置了Hibernate ImprovedNamingStrategy.这意味着如果我的实体类有一个变量userName,那么Hibernate应该将它转换user_name为查询数据库.但是在我升级到Hibernate 5后,这个命名转换停止了工作.我收到错误:
错误:"字段列表"中的未知列'user0_.userName'
这是我的Hibernate配置:
@Configuration
@EnableJpaRepositories("com.springJpa.repository")
@EnableTransactionManagement
public class DataConfig {
@Bean
public DataSource dataSource(){
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("admin");
return ds;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(Boolean.TRUE);
vendorAdapter.setDatabase(Database.MYSQL);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setDataSource(dataSource());
factory.setPackagesToScan("com.springJpa.entity");
Properties jpaProperties = new Properties();
jpaProperties.put("hibernate.ejb.naming_strategy","org.hibernate.cfg.ImprovedNamingStrategy");
jpaProperties.put("hibernate.dialect","org.hibernate.dialect.MySQL5InnoDBDialect");
factory.setJpaProperties(jpaProperties);
factory.afterPropertiesSet();
return factory;
}
@Bean
public SharedEntityManagerBean entityManager() {
SharedEntityManagerBean entityManager = new SharedEntityManagerBean();
entityManager.setEntityManagerFactory(entityManagerFactory().getObject());
return entityManager;
}
@Bean
public …Run Code Online (Sandbox Code Playgroud) 我想我正在尝试做一些非常简单的事情.在JPA中使用Spring Boot(1.3.3.RELEASE)我想设置一个表名.
@Entity
@Table(name = "MyTable_name")
public class MyTableData {
...
}
Run Code Online (Sandbox Code Playgroud)
我期望在我的数据库中有一个带有"MyTable_name"的表.对我来说似乎完全合理.但这不会发生.我得到一个名为"MY_TABLE_NAME"(H2后端)或"my_table_name"(Postgre后端)的表.从这里开始,我会坚持使用Postgre,因为我的目标是读取一个我不控制表名的现有数据库.
经过一些研究后,我发现帖子说我应该使用spring.jpa.hibernate.naming-strategy属性.这没有多大帮助.设置为最常推荐的org.hibernate.cfg.ImprovedNamingStrategy会产生相同的行为:"my_table_name".设置为org.hibernate.cfg.EJB3NamingStrategy会生成"mytable_name".设置为org.hibernate.cfg.DefaultNamingStrategy会导致Spring内部的应用程序上下文错误.
辞职写我自己,我开始看org.hibernate.cfg.ImprovedNamingStrategy.我发现它使用了弃用的org.hibernate.cfg.NamingStrategy.这表明使用NamingStrategyDelegator.我查看了它的Java文档,但不确定如何应用.我找到了这篇文章.尽管我很欣赏这个解释,但是我想要做的事情比我需要的更复杂,而且我在应用它时遇到了麻烦.
那么我的问题是如何让Spring JPA只使用我指定的名称?是否有使用NamingStrategyDelegator的新属性?我需要编写自己的策略吗?
===========更新==========================
我想我正在回答一个问题.我创建了一个简单的Spring启动应用程序(与我的生产项目分开).我使用H2作为后端DB.
关于Hiberate 5命名的讨论非常有用.有了它,我想出了如何在Hibernate 5中设置命名策略,如下所示(在application.properties中).
hibernate.implicit_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Run Code Online (Sandbox Code Playgroud)
我创建了一个通过名称传递的物理命名策略(如org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl)并打印出值.从那里我看到表名是我想通过物理命名层.
然后我设置hibernate.show_sql = true来显示生成SQL.在生成的SQL中,名称也是正确的.
我正在使用DatabaseMetaData检查表名.
private void showTables() throws SQLException {
DatabaseMetaData dbMetadata = getConnection().getMetaData();
ResultSet result = dbMetadata.getTables(null, null, null, new String[] { "TABLE" });
if (result != null) {
boolean haveTable = false;
while (result.next()) {
haveTable = true;
getLogger().info("Found table {}", result.getString("TABLE_NAME"));
}
if (!haveTable) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试从WildFly 8.2.0迁移到WildFly 10.0.0,这意味着我已经(并希望)从Hibernate 4.3迁移到Hibernate 5.0.
Java 8u40
Spring 4.1.9
SQL Server 2012
Wildfly 8.2.0 -> Wildfly 10.0.0
Hibernate 4.3.6 -> Hibernate 5.0.7
Run Code Online (Sandbox Code Playgroud)
我已经阅读了迁移指南,并且我遇到了命名策略的变化.我在SO上已经 阅读了 很多 关于这个的问题,但是我看起来有点不同.Hibernate抱怨找不到表:
INFO [o.h.Version] HHH000412: Hibernate Core {5.0.7.Final}
INFO [o.h.cfg.Environment] HHH000206: hibernate.properties not found
INFO [o.h.cfg.Environment] HHH000021: Bytecode provider name : javassist
INFO [o.h.annotations.common.Version] HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
INFO [o.h.dialect.Dialect] HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
INFO [o.h.envers.boot.internal.EnversServiceImpl] Envers integration enabled? : true
INFO [o.h.validator.internal.util.Version] HV000001: Hibernate Validator …Run Code Online (Sandbox Code Playgroud) 我想使用休眠 5.x。在 hibernate 5.x 中,有新的接口ImplicitNamingStrategy和PhysicalNamingStrategy。
对于name实体的属性,User我希望user_name在我的数据库中有一个列名。我不想用@Column(name="..."). 我尝试编写自定义,ImplicitNamingStrategy但无法获取拥有实体的名称。
public class MyNamingStrategy extends ImplicitNamingStrategyComponentPathImpl
{
@Override
public Identifier determineBasicColumnName ( ImplicitBasicColumnNameSource source )
{
// How to get the name of the owning entity?
String owningEntityName = "howdoigetthis";
Identifier basicColumnName = super.determineBasicColumnName(source);
Identifier identifier = Identifier.toIdentifier(owningEntityName +"_" + basicColumnName.toString());
return identifier;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法只使用 NamingStrategy 来为每一列添加表(或实体)名称的前缀?