Spring Boot & Hibernate: NVARCHAR column type without @Type annotation

Tit*_*lum 6 hibernate jpa spring-data spring-data-jpa spring-boot

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

@Entity
public class Customer {
  // ...

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

  // ...
}
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以配置hibernate以能够映射到NVARCHAR类型而不使用@Type注释,这符合JPA规范?

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

Sim*_*lli 11

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

@Entity
public class Customer {
  // ...

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

  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

如果您的应用程序和数据库使用国家化,您可能希望默认启用国家化字符数据。

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

在 application.properties 中你可以设置:

spring.jpa.properties.hibernate.use_nationalized_character_data =true
Run Code Online (Sandbox Code Playgroud)

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

  • 不,那是休眠。JPA 规范不包括国有化 (2认同)
  • 没有符合 JPA 的解决方案。顺便提一句。JPA 只是 Hibernate 或任何其他 OR-Mappers 之上的一层,并且仅具有底层实现的功能的子集。我使用 OR-Mapping 已有 20 年了,迟早我必须使用实现规范。 (2认同)

Tit*_*lum 8

实际上,事实证明,@ColumnJPA 注释允许您指定列类型(无需使用@Type@Nationalized注释):

@Column(name = "first_name", columnDefinition = "nvarchar", nullable = false)
private String firstName; 
Run Code Online (Sandbox Code Playgroud)