JPA保存数据异常:org.hibernate.AnnotationException: @COLUMN(s) NOT allowed ON a @ManyToOne property

本文介绍了解决Hibernate框架中出现的主键自增异常问题的方法。通过分析异常原因,发现是在实体类中未正确配置主键生成策略。文中提供了具体的解决方案,即在实体类中添加主键自增策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.org.hibernate.AnnotationException异常如下图

org.hibernate.AnnotationException: @COLUMN(s) NOT allowed ON a @ManyToOne property: com.java.bean.Student.grade

这里写图片描述

2. 原因

我出现org.hibernate.AnnotationException注解异常的原因是,在表中设置了班级Grade表主键自增功能,但是在对应的Grade实体类中没有设置对应ID(主键)的生成策略(或者说主键自增功能)

@GeneratedValue(strategy=GenerationType.IDENTITY)

3. 解决方案

在实体类中添加主键自增策略

2025-06-06 16:23:07.193 ERROR 15884 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Unable to create unique key constraint (numder) on table dingdan: database column 'numder' not found. Make sure that you use the correct column name which depends on the naming strategy in use (it may not be the same as the property name in the entity, especially for relational types) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1799) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1109) ~[spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869) ~[spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:755) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:402) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:173) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:153) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:95) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:172) [spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5128) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1133) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1866) [catalina.jar:9.0.37] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_331] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_331] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.37] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) [na:1.8.0_331] at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1045) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:429) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) [catalina.jar:9.0.37] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_331] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.37] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [na:1.8.0_331] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.startup.Catalina.start(Catalina.java:738) [catalina.jar:9.0.37] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_331] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_331] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_331] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_331] at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342) [bootstrap.jar:9.0.37] at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473) [bootstrap.jar:9.0.37] Caused by: org.hibernate.AnnotationException: Unable to create unique key constraint (numder) on table dingdan: database column 'numder' not found. Make sure that you use the correct column name which depends on the naming strategy in use (it may not be the same as the property name in the entity, especially for relational types) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.buildUniqueKeyFromColumnNames(InFlightMetadataCollectorImpl.java:2133) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.buildUniqueKeyFromColumnNames(InFlightMetadataCollectorImpl.java:1994) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processUniqueConstraintHolders(InFlightMetadataCollectorImpl.java:1982) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1667) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378) ~[spring-orm-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1858) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1795) ~[spring-beans-5.2.15.RELEASE.jar:5.2.15.RELEASE] ... 58 common frames omitted
最新发布
06-08
<think>我们遇到的是一个SpringBoot项目启动失败的问题。错误信息显示在创建名为'entityManagerFactory'的bean时失败,原因是Hibernate尝试在表'dingdan'上创建一个名为'numder'的唯一键约束时,发现数据库列'numder'不存在。根本原因分析:1.实体类中可能定义了一个唯一约束(uniqueconstraint)用到了属性"numder",但是数据库中对应的列名不是"numder"。2.这可能是因为Hibernate的命名策略(namingstrategy)将实体属性转换为数据库列名时,导致实际列名与属性名不一致。3.错误提示建议我们检查列名是否根据命名策略发生了改变(例如,默认的命名策略会将驼峰命名的属性转换为下划线分隔的列名)。具体到这个错误:Hibernate在表'dingdan'上创建唯一键约束时要求列'numder',但数据库中不存在这个列名。解决方案:1.检查实体类中定义唯一约束的属性名是否正确,以及数据库中实际列名是什么。2.确认命名策略。例如,如果使用默认的命名策略,属性名为"numder",数据库列名应该是"numder"(如果使用SpringBoot的默认策略,它会将驼峰转为下划线,比如"numDer"会变成"num_der",但这里属性名是"numder",即全小写,那么下划线命名后还是"numder")。3.但错误中明确说找不到列名'numder',可能的原因有:a)数据库中表'dingdan'确实没有'numder'列(可能是拼写错误)。b)实体类中使用的属性名和数据库列名不一致,因为命名策略改变了列名。如何修正:步骤1:检查实体类中关于唯一约束的注解。比如,可能使用@UniqueConstraint注解指定了列名。例如,在实体类中可能有如下注解:```java@Table(name="dingdan",uniqueConstraints={@UniqueConstraint(columnNames={"numder"})})```步骤2:检查数据库表'dingdan'的实际列名。假设我们发现实际列名可能是"number"(因为可能是拼写错误)或者"num_der"(如果使用了驼峰转下划线)。步骤3:根据实际列名修正实体类中的注解。情况1:如果数据库列名是"number",那么将注解中的"numder"改为"number"。情况2:如果数据库列名是"num_der",那么将注解中的"numder"改为"num_der"。步骤4:如果实体类中的属性名确实写错了,那么修正属性名并确保与数据库列名匹配。另一种做法是避免在注解中直接使用列名,而是让命名策略自动处理。但是,如果已经指定了唯一约束,则必须使用数据库列名。另外,如果数据库列名是使用下划线命名法,而实体类属性是驼峰命名,那么我们在写columnNames的时候应该使用下划线形式的列名。假设实体类属性名为"numDer",那么数据库列名可能是"num_der"。此时,在唯一约束中应该使用"num_der"。但是,根据错误信息,我们试图创建唯一约束的列名为'numder',所以我们需要将其改为正确的列名。修改示例:修正前:```java@Table(name="dingdan",uniqueConstraints=@UniqueConstraint(columnNames="numder"))```修正后(假设实际列名是"number"):```java@Table(name="dingdan",uniqueConstraints=@UniqueConstraint(columnNames="number"))```步骤5:如果数据库缺少该列,还需要更新数据库表结构,添加对应的列。另外,我们可以通过配置Hibernate的日志级别来查看自动建表时的SQL,或者设置hibernate.hbm2ddl.auto为update(如果允许),这样Hibernate会根据实体更新数据库结构(生产环境慎用)。但是,根据错误堆栈,似乎是在启动时创建实体管理工厂(entityManagerFactory)的时候检查映射信息,这时Hibernate会验证数据库表结构是否与映射一致。因此,我们必须保持两者一致。总结:修正实体类中关于唯一约束的列名,使其与数据库实际列名一致。如果问题依然存在,我们可以检查命名策略配置,例如:-SpringBoot默认使用的命名策略是SpringPhysicalNamingStrategy,它会将驼峰命名字段转换为下划线分隔。-可以在application.properties中通过如下配置更改命名策略(不推荐随意更改,除非理解其行为):spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl使用这个配置后,列名会与属性名完全相同(即不会转换),那么实体中写什么列名,数据库就用什么列名。但是,在已经存在数据库表结构的情况下,建议保持命名策略不变,并修正实体类中的列名。代码修改示例(假设数据库列名是"num_der",而实体属性名为"numDer"):实体类中:```javapublicclassDingdan{@Column(name="num_der")//显式指定列名privateStringnumDer;//...其他属性和方法}```然后,在唯一约束中就可以使用这个列名:```java@Table(name="dingdan",uniqueConstraints=@UniqueConstraint(columnNames="num_der"))```这样,Hibernate就会去查找列名为"num_der"的字段,而不会用属性名"numDer"。注意:在@UniqueConstraint的columnNames中,必须使用数据库中的实际列名(即如果使用了@Column的name属性,那么这里就要用name指定的值;如果没有使用@Column指定,那么就是命名策略转换后的列名)。所以,我们有两种方法:方法一:不在实体属性上使用@Column指定列名,然后在唯一约束中使用命名策略转换后的列名(如"num_der")。方法二:在实体属性上使用@Column指定列名,然后在唯一约束中直接使用这个指定的列名。我们推荐方法二,因为它更明确。最后,重新启动应用,检查是否修复。如果无法确定实际列名,可以检查数据库表结构,或者查看Hibernate启动时生成的日志(设置日志级别为debug):在application.properties中设置:logging.level.org.hibernate.SQL=DEBUGlogging.level.org.hibernate.type=TRACE这样可以看到Hibernate执行的操作。如果问题解决了,那么启动就不会报错。下面,我们将根据常见情况编写代码示例。假设实体类名为DingdanEntity,原来的错误写法:```javaimportjavax.persistence.*;@Entity@Table(name="dingdan",uniqueConstraints=@UniqueConstraint(columnNames="numder"))publicclassDingdanEntity{//...其他属性privateStringnumder;//或者可能是privateStringnumDer;//gettersandsetters}```修改后(假设数据库列名是"number"):```javaimportjavax.persistence.*;@Entity@Table(name="dingdan",uniqueConstraints=@UniqueConstraint(columnNames="number"))//修改这里publicclassDingdanEntity{//...其他属性//情况1:如果属性名对应数据库列名是"number",则:@Column(name="number")privateStringnumder;//或者将属性名改为number?但是不需要,只要@Column指定即可//或者我们不改变属性名,但使用@Column指定列名//情况2:或者我们不改变属性名,且不指定@Column,而是用命名策略转换,那么我们需要保证属性名转换后为"number"(即属性名就是number)//但是,这里我们为了灵活性,使用@Column指定列名//gettersandsetters}```注意:如果使用@Column指定了列名,那么唯一约束中使用的列名要和@Column的name一致。如果数据库表还没有这个列,那么我们可能需要添加。可以在数据迁移脚本(如Flyway或Liquibase)中添加,或者通过设置hibernate.hbm2ddl.auto=update(仅开发环境)让Hibernate自动添加。不过,在生产环境中,通常不允许hibernate自动更新数据库结构,而是通过数据库迁移工具。因此,我们修复步骤:1.修正实体类中的唯一约束的列名。2.如果数据库表缺少列,编写数据库迁移脚本添加列(例如对于MySQL):ALTERTABLEdingdanADDCOLUMNnumberVARCHAR(255)[其他约束];并添加唯一约束(如果原来是唯一约束的话):ALTERTABLEdingdanADDCONSTRAINTunique_numberUNIQUE(number);3.重新启动应用。如果问题解决,则启动成功。如果没有解决,请检查其他可能的原因,例如是否有多个数据源配置、自定义的命名策略等。由于这是一个配置问题,我们并没有运行时的代码,所以上述主要是对实体类的修正。下面提供一些相关的配置说明和代码示例。配置文件application.properties(如果需要改变命名策略,但通常不建议):```#使用Hibernate的标准命名策略,这样数据库列名与属性名完全一样(不会驼峰转下划线)spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl```但是,请注意,使用PhysicalNamingStrategyStandardImpl可能会导致已有的数据库列名与实体属性名不一致的问题,因此需要谨慎。通常,我们更倾向于修正实体类中的列名。最后,如果经过检查发现是拼写错误,那么改正拼写错误即可。让我们再回顾一下错误信息:`Unabletocreateuniquekeyconstraint(numder)ontabledingdan:databasecolumn'numder'notfound.`这里Hibernate要创建唯一约束名为'(numder)',注意括号里面的可能是约束名,而错误信息说列名'numder'没找到。因此,我们关注的是这个唯一约束对应的列名。在@UniqueConstraint中,我们通常这样写:columnNames="numder"//这里写的是列名(数组),而不是约束名。如果我们要指定约束名,可以这样:@UniqueConstraint(name="myUniqueConstraint",columnNames="numder")错误中的约束名是"numder"?还是Hibernate自动生成的?这里不太明确,但是错误是因为列名'numder'找不到。因此,我们主要关注列名。总结步骤:1.在实体类中查找所有使用@UniqueConstraint的地方,看columnNames是否包含"numder"。2.检查数据库表dingdan是否存在该列,若不存在,考虑添加或修正列名。3.修正实体类中的@UniqueConstraint的columnNames,使其与数据库列名一致。如果有多列唯一约束,同样需要检查每一列。希望以上解决方案能帮助解决问题。§§相关问题§§:1.如何在SpringBoot中配置Hibernate的命名策略?2.如何使用Hibernate的自动更新数据库结构(hbm2ddl.auto)?3.除了使用@UniqueConstraint,还有哪些方式可以为数据库表添加唯一约束?4.如何通过数据库迁移工具(如Flyway)为表添加列和唯一约束?5.如何在启动时生成Hibernate的SQL日志以便调试?6.如果实体类中使用的是@Column(name="..."),那么@UniqueConstraint的columnNames应该用哪个名字?</think> ### 分析及解决方案 错误信息核心问题:**Hibernate 在 `dingdan` 表上创建名为 `numder` 的唯一键约束失败,因为数据库找不到名为 `numder` 的列**。根本原因是实体类定义的列名 `numder` 与数据库实际列名不匹配,通常是命名策略转换导致的问题(如驼峰命名转为下划线命名)。 #### 解决方案步骤: 1. **检查数据库表结构**:确认 `dingdan` 表是否存在名为 `numder` 的列 2. **检查实体类定义**:核对 `@Column` 注解和 `@UniqueConstraint` 中的列名 3. **明确命名策略行为**:查看当前使用的命名策略(如 `SpringPhysicalNamingStrategy` 会转驼峰为蛇形) ```java // 实体类错误示例 @Entity @Table(name = "dingdan", uniqueConstraints = @UniqueConstraint(name = "uq_numder", columnNames = "numder")) public class Dingdan { @Column(name = "numDer") // 驼峰命名但数据库实际列名可能是num_der private String numDer; // 这里属性名大小写混乱导致错误 } ``` ### 修复代码示例 ```java // 正确实体类定义 @Entity @Table(name = "dingdan", uniqueConstraints = @UniqueConstraint( name = "uq_number", // 明确约束名 columnNames = "number" // 使用实际数据库列名 )) public class Dingdan { // 选项1:显式指定列名(推荐) @Column(name = "number") // 必须匹配数据库列名 private String number; // 属性名与列名一致 // 选项2:使用下划线命名 private String num_der; // 直接匹配数据库蛇形命名 // Getter/Setter } ``` ### 关键配置调整 ```properties # application.properties - 开启命名策略调试 spring.jpa.show-sql=true logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE ``` ### 其他修复方式 1. **全局命名策略覆盖**(不推荐): ```properties spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl ``` 2. **数据库迁移脚本**(适合生产环境): ```sql ALTER TABLE dingdan RENAME COLUMN num_der TO number; -- 统一列名 ``` ### 错误预防建议 1. 保持实体类属性名与数据库列名完全一致 2. 避免混用驼峰/蛇形命名 3. 在 `@UniqueConstraint` 中始终使用数据库实际列名 4. 通过 `show-sql` 验证生成的SQL语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值