当前位置: 首页 > 面试题库 >

改进的命名策略不再在Hibernate 5中工作

孟子墨
2023-03-14
问题内容

我有简单的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 PlatformTransactionManager transactionManager() {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return txManager;
    }

    @Bean
    public ImprovedNamingStrategy namingStrategy(){
        return new ImprovedNamingStrategy();
    }
}

这是我的Entity类:

@Getter
@Setter
@Entity
@Table(name="user")
public class User{

    @Id
    @GeneratedValue
    private Long id;

    private String userName;
    private String email;
    private String password;
    private String role;

}

我不想在@Column批注中显式命名我的数据库字段。我希望我的配置可以将驼峰式大小写转换为下划线。

请指导。


问题答案:

刚发现问题,使用Hibernate版本<5.0的配置绝对可以,但是对于Hibernate> = 5.0的配置则不是。

我在Spring 4.2.0.RELEASE中使用了Hibernate 5.0.0.Final。我猜Hibernate 5与Spring
4.2不完全兼容。我只是将Hibernate降级为4.2.1,最终一切正常。

NamingStrategyHibernate 5中不推荐使用Hibernate的类。



 类似资料:
  • 问题内容: 我对hibernate(5.1版)的命名策略有些困惑-即它更改了我的表名,我想避免这种情况。另外- 根据intelij似乎已弃用,但我找不到正确配置它的(另一种)方法。 我在application.properties中具有以下配置: 如前所述,第一个被标记为已练习。 现在我有一个实体: 表格名称是类似usaUploadTable 中的名称。 现在,当我运行我的应用程序时,我得到 表’

  • 我对hibernates(5.1版)的命名策略有点困惑——也就是说,它改变了我的表名,我希望避免这种情况。还有-

  • 我是Micronaut的新手,我正在尝试将其与现有数据库一起使用。 我有一个带有显式表和列命名的实体,比如 即使我在应用程序中配置了。yml是这样的(以及各种变体,我尝试了各种物理命名策略的值): 我仍然得到这个错误 。 好像我的配置完全被忽略了。 Micronaut代码版本<3.3 我错过什么了吗? 更新 之前: 之后: 只是说,配置是在正确的位置,对的更改是值得的,对的更改显然被忽略了。 实际

  • 我知道我可以用注释命名所有表,并为所有列提供名称,但这不是我想要的解决方案。 不幸的是,我没有找到任何匹配我的案例的策略(我知道这展示了如何创建自定义命名策略,但我不认为我的案例是不常见的),我应该为我的MariaDB配置使用什么命名策略来匹配我的案例?

  • underscored 参数 Sequelize 为模型提供了 underscored 参数. 设为 true 时,此参数会将所有属性的 field 参数设置为其名称的 snake_case 版本. 这也适用于由关联和其他自动生成的字段自动生成的外键. 例: const User = sequelize.define('task', { username: Sequelize.STRING },

  • Kotlin+Spring Boot Cassandra应用程序忽略了注释。下面的注释 正在映射到而不是。由于列在表中不存在,因此会导致运行时错误。