【问题标题】:Using MySQL, why doesn't Hibernate/JPA create foreign key constraints for me?使用 MySQL,为什么 Hibernate/JPA 不为我创建外键约束?
【发布时间】:2012-02-01 23:40:46
【问题描述】:

在这里记录这一点,因为我只是浪费了一个小时试图弄清楚这一点。

我有一个实体 Foo:

@ManyToOne(optional = false)
@JoinColumn(name = "barId")
private Bar bar;

为什么 Hibernate 不在 foo.bar -> bar.id 上创建外键约束?

【问题讨论】:

    标签: mysql hibernate jpa


    【解决方案1】:

    这里建议Hibernate: Create Mysql InnoDB tables instead of MyISAM 你也可以更改Hibernate dialect来使用

    org.hibernate.dialect.MySQL5InnoDBDialect
    

    侵入性较小。

    只是想将此添加为替代解决方案。

    【讨论】:

    • 我正在使用 JPA 来创建我的架构,上面放在哪里?在persistance.xml 中?
    • 它在 hibernate.properties 文件中
    【解决方案2】:

    这是因为 MySQL 不支持使用 ENGINE=MyISAM 创建的表的外键约束。您需要使用 ENGINE=InnoDB 创建(两个!)表。您可以通过调整 my.cnf 并添加默认值或在 JDBC URL 中使用特殊变量来实现:

    jdbc:mysql://localhost/dbname?characterEncoding=utf8&sessionVariables=storage_engine=InnoDB
    

    【讨论】:

    • FWIW,在 MySQL 5.5 中,InnoDB终于成为开箱即用的默认存储引擎。
    • 我已将此添加到我的 JDBC 连接字符串中,现在我得到了 java.sql.SQLException: Unknown system variable 'storage_engine'
    • 我已将此添加到我的 JDBC 连接字符串中,现在我得到 java.sql.SQLException: Unknown system variable 'storage_engine'
    【解决方案3】:

    使用 SpringBoot,您可以将 application.properties 设置为:

    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect   
    

    它应该可以正常工作。

    【讨论】:

    • 这解决了我在使用 Spring Boot 时遇到的问题。
    • 如果这不起作用,试试这个:spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57InnoDBDialect
    • 这实际上对我有用 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多