Spring Boot & Hibernate:没有@Type 注释的 NVARCHAR 列类型

Posted

技术标签:

【中文标题】Spring Boot & Hibernate:没有@Type 注释的 NVARCHAR 列类型【英文标题】:Spring Boot & Hibernate: NVARCHAR column type without @Type annotation 【发布时间】:2020-08-05 03:19:12 【问题描述】:

我的数据库中有一个表用于我的Customer 实体。此表包含一些类型为 NVARCHAR 的列(这是一个要求,我无法更改它),但 Hibernate 无法在不使用 @Type 的情况下将此列类型映射到我的 Entity 中的正确属性注释,它抱怨它需要一个类型为VARCHAR而不是NVARCHAR的列:

@Entity
public class Customer 
  // ...

  @Column(name = "first_name", nullable = false)
  @Type(type="org.hibernate.type.StringNVarcharType")
  private String firstName;

  // ...

有没有什么方法可以在不使用@Type注解的情况下将hibernate配置为能够映射到NVARCHAR类型,即符合JPA规范?

Spring Boot 版本:2.1.12.RELEASE 休眠版:5.3.15.Final 休眠方言:org.hibernate.dialect.SQLServer2012Dialect

【问题讨论】:

【参考方案1】:

其实@ColumnJPA注解可以让你指定列类型(不必使用@Type@Nationalized注解):

@Column(name = "first_name", columnDefinition = "nvarchar", nullable = false)
private String firstName; 

【讨论】:

【参考方案2】:

推荐的方法是使用@Nationalized注解:

@Entity
public class Customer 
  // ...

  @Column(name = "first_name", nullable = false)
  @Nationalized 
  private String firstName;

  // ...

但您也可以将其设置为默认值:

如果您的应用程序和数据库使用国有化,您可以改为 想要默认启用国有化字符数据。

您可以通过 hibernate.use_nationalized_character_data 执行此操作 设置或通过调用 MetadataBuilder#enableGlobalNationalizedCharacterDataSupport 期间 引导程序。

在 application.properties 中可以设置:

spring.jpa.properties.hibernate.use_nationalized_character_data =true

在 Hibernate 文档https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#basic-nationalized中了解更多信息

【讨论】:

但是 @Nationalized 注释是 JPA 规范的一部分吗? 不,那是休眠。 JPA Spec 不包括国有化 好的,谢谢!您的答案有效,但我正在寻找一种符合 JPA 规范的方法。无论如何,我都赞成您的问题,因为如果您不希望符合 JPA,这是一种解决问题的好方法。 没有符合 JPA 的解决方案。顺便提一句。 JPA 只是 Hibernate 或任何其他 OR-Mapper 之上的一层,并且仅具有底层实现功能的子集。我使用 OR-Mapping 已有 20 年了,迟早我必须使用实现规范。

以上是关于Spring Boot & Hibernate:没有@Type 注释的 NVARCHAR 列类型的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot&&Spring Cloud系列Spring Boot初识

dubbo && spring-boot-starter

Spring-boot & hibernate,使用事务

Spring Boot - ApplicationRunner && CommandLineRunner扩展接口

Spring Boot - ApplicationRunner && CommandLineRunner扩展接口

Spring boot 项目脚手架&开源框架