programing

Spring Boot + JPA : 열 이름 주석이 무시되었습니다.

firstcheck 2022. 7. 31. 21:24
반응형

Spring Boot + JPA : 열 이름 주석이 무시되었습니다.

종속성이 있는 Spring Boot 애플리케이션을 사용하고 있다.spring-boot-starter-data-jpa. 엔티티 클래스에는 열 이름이 있는 열 주석이 있습니다.예를 들어 다음과 같습니다.

@Column(name="TestName")
private String testName;

이로 인해 생성된 SQLtest_name열 이름으로 지정합니다.해결책을 찾아본 결과 다음과 같은 사실을 알게 되었습니다.spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy문제를 해결했습니다(열 이름은 열 주석에서 가져옵니다).

하지만 왜 naming_strategy가 설정되지 않은 상태에서EJB3NamingStrategyJPA가 열 주석을 무시하고 있습니까?겨울잠 사투리가 관련이 있는 건 아닐까요?MS SQL 2014 Express에 연결하려고 하는데 로그에는 다음이 포함됩니다.

Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect 

휴지 상태 5의 경우 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

기본적으로는 스프링 사용org.springframework.boot.orm.jpa.SpringNamingStrategy테이블 이름을 생성합니다.이것은 매우 얇은 확장입니다.org.hibernate.cfg.ImprovedNamingStrategy.그tableName그 클래스의 메서드는 소스를 전달합니다.String값이지만, 그것이 로부터 온 것인지 아닌지는 모른다.@Column.name속성 또는 필드 이름에서 암묵적으로 생성된 경우.

ImprovedNamingStrategy변환하다CamelCase로.SNAKE_CASE어디인가 하면EJB3NamingStrategy는 테이블 이름만 변경하지 않고 사용합니다.

이름 지정 전략을 변경하지 않으려면 항상 열 이름을 소문자로 지정할 수 있습니다.

@Column(name="testname")

인 것 같다

@Column(name="..")

완전히 무시됩니다.

spring.jpa.caperate.naming_caperate=spring.jpa.capg.EJB3 명명 전략

특정되어 있기 때문에, 이것은 버그입니다.

@Column(name=")의 이유를 알기 위해 몇 시간을 소비했습니다." )는 무시되었습니다.

디폴트 전략@Column(name="TestName")될 것이다test_name, 이것은 올바른 동작입니다!

이름이 붙은 열이 있는 경우TestName데이터베이스에서 열 주석을 다음으로 변경해야 합니다.@Column(name="testname").

이 방법은 사용자가 열 이름을 TestName으로 지정하든 testname으로 지정하든 데이터베이스가 상관하지 않기 때문에 작동합니다(열 이름은 대소문자를 구분하지 않음).

단, UNIX 시스템에서는 대소문자가 구분되지만 Windows 시스템에서는 대소문자가 구분되는 데이터베이스 이름이나 테이블 이름(많은 사용자가 야간에 윈도 작업을 하고 Linux 상에서 도입하는 경우)에는 적용되지 않습니다.

저에게 효과가 있었던 유일한 해결책은 위의 teteArg가 올린 것입니다.Spring Boot 1.4.2와 Hibernate 5를 탑재하고 있습니다.즉,

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

자세한 정보를 얻기 위해 콜 트레이스를 투고하고 있습니다.이것에 의해, Spring이 네이밍 전략을 설정하기 위해서 어떤 콜을 휴지 상태로 하고 있는지를 명확하게 할 수 있습니다.

      at org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl.toPhysicalColumnName(PhysicalNamingStrategyStandardImpl.java:46)
  at org.hibernate.cfg.Ejb3Column.redefineColumnName(Ejb3Column.java:309)
  at org.hibernate.cfg.Ejb3Column.initMappingColumn(Ejb3Column.java:234)
  at org.hibernate.cfg.Ejb3Column.bind(Ejb3Column.java:206)
  at org.hibernate.cfg.Ejb3DiscriminatorColumn.buildDiscriminatorColumn(Ejb3DiscriminatorColumn.java:82)
  at org.hibernate.cfg.AnnotationBinder.processSingleTableDiscriminatorProperties(AnnotationBinder.java:797)
  at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:561)
  at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245)
  at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222)
  at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265)
  at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
  at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
  at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
  at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
  at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
  at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
  at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
  - locked <0x1687> (a java.util.concurrent.ConcurrentHashMap)
  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
  at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081)
  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856)
  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
  - locked <0x1688> (a java.lang.Object)
  at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
  at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)

테테아그, 정말 고마워요추가 정보만 있으면 이 질문에 부딪히는 모든 사람들이 이유를 이해할 수 있을 것입니다.

teteArg가 말한 내용은 Spring Boot Common Properties(http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html)에 기재되어 있습니다.

spring.jpa.hibernate.naming.strategy는 하이버네이트5를 사용한Spring JPA 실장에서는 지원되지 않는 것 같습니다.

보니 나는 그냥 변환만 것 같아.@column이름 test 이름 처음에는 camel 대소문자였기 때문에 모든 작은 글자에 이름을 붙입니다.

공식 답변을 사용할 수 없었지만, 조사 내용을 알려줌으로써 문제를 해결하는 데 도움이 되었습니다.

변경:

@Column(name="testName")
private String testName;

수신인:

@Column(name="testname")
private String testName;

spring jpa를 사용할 때는 명명 전략을 따라야 합니다.열 이름은 소문자 또는 대문자여야 합니다.

@Column(name="TESTNAME")
private String testName;

또는

@Column(name="testname")
private String testName;

데이터베이스에 열 이름 "test_name" 형식이 있는 경우 다음 방법을 따라야 합니다.

@Column(name="TestName")
private String testName;

또는

@Column(name="TEST_NAME")
private String testName;

또는

@Column(name="test_name")
private String testName;

@Column(...)을 사용하는 경우 실제 DB 열이 camel-case인 경우에도 항상 작은 대소문자를 사용하십시오.

: : 열 이 DB일 TestName다음과 같습니다.

  @Column(name="testname") //all small-case

이것이 마음에 들지 않으면 실제 DB 열 이름을 test_name으로 변경하기만 하면 됩니다.

제 경우, 주석은 필드 자체(레거시 애플리케이션에서 포트)가 아닌 getter() 메서드에 있었습니다.

스프링은 이 경우에도 주석을 무시하지만 불평하지 않습니다.해결책은 그것을 게터가 아닌 필드로 옮기는 것이었습니다.

위 사항을 모두 시도해 봤지만 효과가 없었습니다.이 방법은 효과가 있었습니다.

@Column(name="TestName")
public String getTestName(){//.........

변수 대신 getter에 주석 추가

저도 위의 모든 것을 시도해 봤지만 소용이 없습니다.DB에 "gunName"이라는 필드가 있어 아래의 예를 사용할 때까지 이 필드를 처리할 수 없었습니다.

@Column(name="\"gunName\"")
public String gunName;

속성 포함:

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

다음 항목도 참조해 주세요.

maven 3.8.3을 사용하여 테이블의 컬럼 이름이 get/set 메서드 네이밍을 따르는 재미있는 경우를 발견했습니다.엔티티에 새 필드를 추가해도 get/set 메서드를 지정하지 않으면 테이블에 새 열이 생성되지 않습니다.

단, 엔티티 클래스에서 모든 get/set 메서드를 삭제하면 테이블 내의 컬럼 이름은 엔티티 클래스의 필드 이름 뒤에 나옵니다.

(저는 초보이기 때문에 논리적인 정확성을 보증하는 기능일 수 있습니다).

언급URL : https://stackoverflow.com/questions/25283198/spring-boot-jpa-column-name-annotation-ignored

반응형