Spring启动会生成错误的sql代码

时间:2018-01-29 08:26:06

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

我正在为我的下一个项目创建一个使用Spring启动的POC。 现在我创建了一个休息服务,它将从MS sql server数据库中查询所有数据。

我要查询的实体如下:

@Entity
@Table(name = "Item", schema = "materialManagement", uniqueConstraints = @UniqueConstraint(columnNames = {
        "companyID", "number" }))
public class Item implements java.io.Serializable {
//all variabels are placed here
}

现在,当我为Item类创建一个存储库时:

public interface NoteRepository extends JpaRepository<Item, Long> {
}

在我的控制器中,我使用findAll()来自动恢复仓库并查询仓库:

@RestController
@RequestMapping("/api")
public class NoteController {
 @Autowired
    NoteRepository noteRepository;

    @GetMapping("/notes")
    public List<Item> getAllNotes() {
        return noteRepository.findAll();
    }
}

现在当我向控制器发送请求时出现以下错误:

  

com.microsoft.sqlserver.jdbc.SQLServerException:无效的对象名称   'material_management.item'。

在数据库中确实没有material_management架构只有materialManagement。但是从那里生成的模式来自哪里?

我的application.properties看起来像:

> spring.datasource.url =
> jdbc:sqlserver://localhost:1433;databaseName=CR_ApplicationSuite;integratedSecurity=true;
> 
> spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
> ## Hibernate Properties
> 
> # The SQL dialect makes Hibernate generate better SQL for the chosen database spring.jpa.properties.hibernate.dialect =
> org.hibernate.dialect.SQLServer2008Dialect

2 个答案:

答案 0 :(得分:1)

Hibernate命名策略用_

取代了驼峰式案例

在你的情况下:

@Table(name = "Item", schema = "materialManagement", ...

变为

material_management

<强>解决方案

要么全部用小写字母删除驼峰情况,要么必须是驼峰情况,你必须更改Hibernate命名策略。

应用程序属性:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

答案 1 :(得分:1)

我将以下行添加到application.properties:

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