Hibernate 6.4.1.Final生成MS-SQL错误@JoinTable SQL的解决方法
解决方法
问题根源
Hibernate 6.x对@JoinTable的schema解析逻辑发生了变化——直接在name属性中写lotr.person_appanage会被视为完整的表名,而非schema.表名的组合。当Hibernate为MS-SQL生成SQL时,会把这个完整字符串用方括号包裹成[lotr.person_appanage],导致SQL Server误认为这是一个名为lotr.person_appanage的单表,而非lotr schema下的person_appanage表,最终触发"无效对象名"错误。
具体解决方案
1. 正确拆分@JoinTable的schema与表名
修改Person和Appanage实体中的@JoinTable注解,单独指定schema属性,name仅保留表名:
Person.java 修改后
@Data @Entity @Table(schema = "lotr", name = "person") public class Person { @Id String person; @ManyToMany @JoinTable( schema = "lotr", name = "person_appanage", joinColumns = { @JoinColumn(name = "person") }, inverseJoinColumns = { @JoinColumn(name = "appanage") } ) List<Appanage> appanages; }
Appanage.java 修改后
@Data @Entity @Table(schema = "lotr", name = "appanage") public class Appanage { @Id String appanage; String description; @ManyToOne @JoinColumn(name = "region") Region region; @ManyToMany @JoinTable( schema = "lotr", name = "person_appanage", joinColumns = { @JoinColumn(name = "appanage") }, inverseJoinColumns = { @JoinColumn(name = "person") } ) List<Person> personnels; }
2. 全局配置默认Schema(可选)
如果所有数据库表都位于lotr schema下,可以通过配置文件设置全局默认schema,避免每个注解重复指定:
application.properties
spring.jpa.properties.hibernate.default_schema=lotr
application.yml
spring: jpa: properties: hibernate: default_schema: lotr
配置后,@JoinTable只需指定表名即可:
@JoinTable( name = "person_appanage", joinColumns = { @JoinColumn(name = "person") }, inverseJoinColumns = { @JoinColumn(name = "appanage") } )
3. 确认SQL Server方言配置
确保使用Hibernate 6兼容的SQL Server方言,避免方言导致的表名格式化异常:
application.properties
spring.jpa.database-platform=org.hibernate.dialect.SQLServer2012Dialect
application.yml
spring: jpa: database-platform: org.hibernate.dialect.SQLServer2012Dialect
内容的提问来源于stack exchange,提问作者MrC0mm0n
相关产品推荐
相关产品推荐

