相关疑难解决方法(0)

ImprovedNamingStrategy不再适用于Hibernate 5

我有简单的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)

java hibernate jpa spring-data-jpa hibernate-5.x

38
推荐指数
4
解决办法
3万
查看次数

在Spring JPA中设置表名

我想我正在尝试做一些非常简单的事情.在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)

spring naming hibernate jpa

10
推荐指数
1
解决办法
1万
查看次数

Hibernate 4 - > 5迁移:NamingStrategy更改,找不到表

我想做的事

我正在尝试从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)

java spring hibernate wildfly hibernate-5.x

8
推荐指数
2
解决办法
5782
查看次数

Hibernate 5 隐式命名策略

我想使用休眠 5.x。在 hibernate 5.x 中,有新的接口ImplicitNamingStrategyPhysicalNamingStrategy

对于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 来为每一列添加表(或实体)名称的前缀?

hibernate hibernate-5.x

5
推荐指数
1
解决办法
2413
查看次数