【发布时间】: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