我有一个spring引导项目,它与此设置一起运行:
@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,相反,它只是将upper_case应用于它(因为upper_case不区分大小写,所以无关紧要):
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个属性的其他实体(我知道这是一种糟糕的做法,但我不允许将其转换为较小的对象),我希望将对象映射责任完全留给hibernate。我知道我可以使用Eclipse的JPA方面来创建带有数据库的映射实体,但是我真的很好奇为什么标准行为不再是标准的了。
在application-context.xml,我有一段代码显示了一些bean配置(包括私有名称):

我使用xirulei作为虚拟配置来查看任何错误,但没有出现任何错误,只出现了与以前相同的行为。改变我的方言,虽然实际上打破了春天,如果这是重要的。
编辑
我发现我的项目是使用spring 1.4.5 reasons,但是由于其他不可争辩的原因,Hibernate是4.2.19.FINAL。
在添加映射之前:
SessionFactory sf = new Configuration()
.setNamingStrategyDelegator(ImprovedNamingStrategyDelegator.DEFAULT_INSTANCE)
.addFile("Item.hbm.xml")
.addFile("Bid.hbm.xml")
.buildSessionFactory();知道我正在使用application-context.xml配置spring/jpa/hibernate,“添加映射之前”应该在哪里呢?我是使用SpringNamingStrategy (作为旧弹簧)还是使用hibernate.ejb.naming_strategy?除此之外,哪些值是有效的?
发布于 2018-08-03 04:59:54
Snake情况是Spring的默认情况,而您看到的是Hibernate的默认情况。见Spring (命名策略)中的Hibernate字段命名问题。
由于您使用属性显式地配置了您的EntityManagerFactory,我想这使得Boot跳过了它的默认配置。由于您的命名策略不存在,Hibernate回到了它的默认状态,这就是您所看到的。
为了解决这个问题,您可以显式引用Spring,也可以通过Spring配置ImprovedNamingStrategy,而不提供命名策略。
https://stackoverflow.com/questions/51662936
复制相似问题