2016-08-05 44 views
4

我使用Spring Data JPA和Hibernate(4.3.11.Final在此版本的Spring Boot中)创建了Spring Boot 1.3.5 POC。我的后端数据库是Microsoft SQL Server,而我们对数据库对象的标准命名约定是pascal大小写(例如MySchema.MyTable.MyColumn)。我使用javax.persistence.Table和javax.persistence.Column标注来设置名称,并将spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.EJB3NamingStrategy添加到我的application.properties文件中。将Spring Boot 1.3迁移到1.4,休眠4到5,Pascal案例问题

一切都很完美。我什至更新到Spring Boot 1.3.6没有问题。

现在我转移到使用Hibernate 5.0.9.Final的Spring Boot 1.4.0.RELEASE,并且已弃用Spring.jpa.hibernate.naming-strategy属性以支持spring.jpa.hibernate.naming.strategy 。我更改了该属性名称,但保留了EJB3NamingStrategy值。我也改变了其他弃用元素:

  • org.springframework.boot.orm.jpa.EntityScan到org.springframework.boot.autoconfigure.domain.EntityScan
  • org.springframework.boot.context.web。 SpringBootServletInitializer到org.springframework.boot.web.support.SpringBootServletInitializer
  • org.springframework.boot.test.SpringApplicationConfiguration到org.springframework.boot.test.context.SpringBootTest(在我的测试类)

现在生成的SQL使用默认的骆驼cas e强调命名约定,而不是我在EJB3NamingStrategy中使用的pascal案例。

//application.properties 
spring.data.jpa.repositories.enabled=true 
spring.data.solr.repositories.enabled=false 
spring.data.mongodb.repositories.enabled=false 
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver 
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.EJB3NamingStrategy 
#spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.EJB3NamingStrategy 

//hibernate.properties 
hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect 
hibernate.format_sql=true 

//Principal.java 
import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.validation.constraints.Size; 

import org.hibernate.envers.AuditTable; 
import org.hibernate.envers.Audited; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@Entity 
@Table(name="Principal", schema="Security") 
@Audited 
@AuditTable(value = "Principal", schema = "Audit") 
public class Principal { 

    private static final Logger LOG = LoggerFactory.getLogger(Principal.class); 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "Id", 
      nullable = false) 
    private Long id; 

    @Column(name = "Username", 
      nullable = false, 
      unique = true) 
    @Size(min = 1, max = 64) 
    private String name; 

    @Column(name = "FirstName", 
      nullable = false) 
    @Size(min = 1, max = 64) 
    private String firstName; 

    @Column(name = "LastName", 
      nullable = false) 
    @Size(min = 1, max = 128) 
    private String lastName; 

    @Column(name = "IsEnabled", 
      nullable = false) 
    private boolean enabled; 

    //getters/setters omitted for brevity 
} 

一部开拓创新的控制台输出:

Hibernate: 
    select 
     principal0_.Id as Id1_8_, 
     principal0_.IsEnabled as IsEnable2_8_, 
     principal0_.FirstName as FirstNam3_8_, 
     principal0_.LastName as LastName4_8_, 
     principal0_.Username as Username5_8_ 
    from 
     Security.Principal principal0_ 
    where 
     principal0_.Username=? 

新的控制台输出:

Hibernate: 
    select 
     principal0_.id as id1_7_, 
     principal0_.is_enabled as is_enabl2_7_, 
     principal0_.first_name as first_na3_7_, 
     principal0_.last_name as last_nam4_7_, 
     principal0_.username as username5_7_ 
    from 
     security.principal principal0_ 
    where 
     principal0_.username=? 
2016-08-05 09:19:22.751 WARN 5032 --- [ XNIO-2 task-8] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 207, SQLState: S0001 
2016-08-05 09:19:22.751 ERROR 5032 --- [ XNIO-2 task-8] o.h.engine.jdbc.spi.SqlExceptionHelper : Invalid column name 'is_enabled'. 
2016-08-05 09:19:22.768 ERROR 5032 --- [ XNIO-2 task-8] io.undertow.request      : UT005023: Exception handling request to /springbootsecurity/login 

我已经广泛地搜查,并发现ImplicitNamingStrategy和PhysicalNamingStrategy参考;但插入这些似乎并不奏效,可能不是正确的方法。我也看到了创建自己的NamingStrategy的参考。那是我必须走的路线吗?

Hibernate 5有不同的设置,它将使用我在@Table和@Column注释中提供的确切名称吗? 我对定义注释的方式有问题吗?

+0

[Hibernate 5.1.x命名策略(与Hibernate 4.x向后兼容)]的可能重复](http://stackoverflow.com/questions/37062675/hibernate-5-1-x-naming-strategy-backward-与hibernate-4-x兼容) –

+0

@AmanTuladhar首先,我对重复道歉。经过几个小时的搜索,我找不到答案。其次,你提供的链接与最终使我得出答案的链接有关。非常感谢!下面发布答案。我不敢相信这很简单。 –

回答

7

我想说我最终发布了一个愚蠢的问题,但我去过的每个方向都谈到了创建自定义命名策略。然而,我的答案只是使用Hibernate的PhysicalNamingStrategyStandardImpl。

添加到application.properties:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl 
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

从我懂事的分析,我假设这工作,因为我使用@Table和@Column注解。 PhysicalNamingStrategyStandardImpl似乎只是将这些注释中的名称用作数据库对象名称。

所以我的Hibernate生成的查询再次格式化为:

Hibernate: 
    select 
     principal0_.Id as Id1_7_, 
     principal0_.IsEnabled as IsEnable2_7_, 
     principal0_.FirstName as FirstNam3_7_, 
     principal0_.LastName as LastName4_7_, 
     principal0_.Username as Username5_7_ 
    from 
     Security.Principal principal0_ 
    where 
     principal0_.Username=? 

阅读@AmanTuladhar's linkthis link从该职位是它最终点击了我。谢谢!

+0

这就是我需要的!非常感谢! – pedorro

+0

这对我工作太谢谢了!奇怪的是,我的代码在本地环境中运行良好,但在AWS EC2 Ubuntu中运行时需要进行上述调整 – philthomas26