Hibernate创建表不成功,sql语法错误

Posted

技术标签:

【中文标题】Hibernate创建表不成功,sql语法错误【英文标题】:Hibernate unsuccesfull create table, sql syntax error 【发布时间】:2017-08-17 20:22:42 【问题描述】:

我尝试使用 hibernate 创建表,但出现 sql 语法错误,我不知道为什么。

用户

@Entity
@Table(name="users")
public class User 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToMany
    @JoinTable(name="user_role", joinColumns = @JoinColumn(name="user_id"),
    inverseJoinColumns = @JoinColumn(name="role_id)"))
    private Set<Role> roles;
    

角色

@Entity
@Table(name="role")
public class Role 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    @ManyToMany(mappedBy="roles")
    private Set<User> users;
    

application.properties

spring.datasource.url = jdbc:mysql://localhost/basket
spring.datasource.username = root
spring.datasource.password =
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000388: Unsuccessful: create table user_role (user_id bigint not null, role_id) bigint not null, primary key (user_id, role_id)))

org.hibernate.tool.hbm2ddl.SchemaUpdate :您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 ') bigint not null, primary key (user_id, role_id)))' 附近使用正确的语法

org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000388: 不成功: 更改表 user_role 添加约束 FK_75dvukqj0muwehqn7y8qi9j5c 外键 (role_id)) 引用角色 (id)

org.hibernate.tool.hbm2ddl.SchemaUpdate :您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“)引用角色(id)”附近使用正确的语法

org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000388: Unsuccessful: alter table user_role add constraint FK_apcc8lxk2xnug8377fatvbn04 外键 (user_id) 引用用户 (id)

org.hibernate.tool.hbm2ddl.SchemaUpdate:表“basket.user_role”不存在

我正在使用 MariaDB 10.1.16。

【问题讨论】:

您的映射对我来说看起来不错,似乎生成的 sql 很奇怪。这可能是方言或其他方面的问题,尽管即便如此,语法似乎也很离谱。一方面,它的结尾括号比开头多,而且它们似乎放错了位置.. 是的,括号肯定有点奇怪。应该是这样的:create table user_role (user_id bigint not null, role_id bigint not null, primary key (user_id, role_id)) 就像每个角色 id 后面都有一个不必要的括号,但我不知道我在哪里犯了错误以及如何修复它。 【参考方案1】:

线路有问题:

@JoinTable(name="user_role", joinColumns = @JoinColumn(name="user_id"),
inverseJoinColumns = @JoinColumn(name="role_id)"))

在您的用户类中。在 role_id 之后删除 ')'。这就是您收到 sql 语法错误的原因。

而且您也没有在两个实体中定义集合“角色”和“用户”。

更改您的声明:

private Set<Role> roles;
private Set<User> users;

private Set<Role> roles=new HashSet<Role>();
private Set<User> users=new HashSet<User>();

【讨论】:

没有帮助。仍然错误。我在 DB 中手动创建了 user_role 表,但仍然报错:HHH000388: Unsuccessful: alter table user_role add column role_id) bigint not null role_id 后面的这个括号让我很生气.. 在你的 spring.datasource.url 中,我认为你没有包括数据库的端口号 它创建了其他没有问题的表,所以我想这不是问题。无论如何添加端口也没有帮助。 你能遇到和这个答案一样的问题吗? ***.com/a/29830890/4233452这解决了我的问题。

以上是关于Hibernate创建表不成功,sql语法错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL 语句“CREATE TABLE TRIP...”中的语法错误

Hibernate 查询以 SQL 语法错误结束

Hibernate 和 MYSQL:您的 SQL 语法有错误?

“您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法错误”Hibernate 4 [重复]

SQL 语句中的 Spring Boot Hibernate 语法错误

休眠和使用数据库索引会在 CockroachDB 上创建 SQL 语法错误