我有一个使用此设置运行的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);
}
}
我发现休眠状态是在映射我的属性而不将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;
我希望休眠将idPessoa属性隐式映射到ID_PESSOA列,因为它是默认行为。我不知道为什么这种情况不会发生。
我还有许多其他具有30-40个属性的实体(我知道这是一种不好的做法,但是我不允许将其更改为较小的对象),我想让对象映射职责完全休眠。我知道我可以使用Eclipse的JPA构面来创建带有数据库的映射实体,但是我很好奇理解为什么标准行为不再是标准行为。
在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?除此之外,哪些值是有效的?
答案 0 :(得分: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,而不提供命名策略。