【问题标题】:Finding where hibernate applies naming strategy查找 hibernate 在哪里应用命名策略
【发布时间】:2018-08-02 22:25:49
【问题描述】:

我有一个使用此设置运行的 Spring Boot 项目:

@SpringBootApplication(exclude=SecurityAutoConfiguration.class)
@ImportResource("classpath:/application-context.xml")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

我发现 hibernate 在映射我的属性时没有将 camelCase 转换为 SNAKE_CASE,相反,它只是对其应用了大写(因为 Oracle 不区分大小写,所以没关系):

Caused by: java.sql.SQLException: ORA-00904: "PESSOA0_"."IDPESSOA": invalid identifier

这是我的实体:

@Entity
@Table(name = "BC_PESSOA")
@NamedQuery(name = "Pessoa.findAll", query = "SELECT p FROM Pessoa p")
public class Pessoa implements Serializable {

  private static final long serialVersionUID = 1L;

  @Id
  private Long idPessoa;

我希望 hibernate 将 idPessoa 属性隐式映射到 ID_PESSOA 列,因为它是默认行为。我不知道为什么这没有发生。

我有大量具有 30-40 个属性的其他实体(我知道这是不好的做法,但我不允许将其更改为更小的对象)并且我想将对象映射职责完全留给休眠状态。我知道我可以使用 Eclipse 的 JPA facet 来创建带有数据库的映射实体,但我真的很想知道为什么标准行为不再是标准的。

application-context.xml,我有这段代码显示了一些 bean 配置(包含私有名称):

我使用xirulei 作为虚拟配置来查看任何错误,但没有出现任何错误,只有与以前相同的行为。改变我的方言虽然实际上打破了春天,如果这很重要的话。

编辑

我发现我的项目使用的是 spring boot 1.4.5.RELEASE,但由于其他无可争议的原因,Hibernate 是 4.2.19.FINAL。看着here我看到了这个:

在添加映射之前:

SessionFactory sf = new Configuration()         
.setNamingStrategyDelegator(ImprovedNamingStrategyDelegator.DEFAULT_INSTANCE)
      .addFile("Item.hbm.xml")
      .addFile("Bid.hbm.xml")
      .buildSessionFactory();

知道我正在使用application-context.xml 配置spring/jpa/hibernate,“添加映射之前”应该在哪里?我应该使用 SpringNamingStrategy(old spring)还是 hibernate.ejb.naming_strategy?除此之外,哪些值是有效的?

【问题讨论】:

  • 为什么要使用xml来配置LocalContainerEntityManagerFactoryBean?放弃会使 Spring Boot 应用它自己的默认值(你基本上是用这个禁用它)。
  • 我还没有问过这个决定背后的人,我是公司的新人,我正在尝试使用 NamingStategy 并尽可能减少对 xml 的更改

标签: hibernate spring-boot spring-data-jpa


【解决方案1】:

Snake case 是 Spring Boot 的默认设置,而您看到的是 Hibernate 的默认设置。见Hibernate field naming issue with Spring Boot (naming strategy)

由于您使用属性显式配置 EntityManagerFactory,我想这会使 Boot 跳过其默认配置。由于您的命名策略不存在,Hibernate 回退到它的默认值,这就是您所看到的。

为了解决这个问题,您可以引用 Spring Boots ImprovedNamingStrategy 显式,或者通过 Spring Boots application.properties 配置 JPA,并且不提供命名策略。

【讨论】:

  • Jens,我更新了我的问题,指定了我想要什么。感谢您的回复,如果您愿意/可以,也请更新您的回复。
猜你喜欢
  • 2023-03-21
  • 2017-01-02
  • 2019-04-16
  • 2016-01-11
  • 2015-11-16
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
相关资源
最近更新 更多