Hibernate用KEY而不是MySQL中的FOREIGN KEY生成DDL

时间:2018-11-27 14:42:19

标签: mysql hibernate

我在JPA(休眠)中设计了模型。

一切正常。

然后我启动了Workbench,并实际上查看了架构。

乍一看一切都很好(我遵循了文档和https://vladmihalcea.com/tutorials/hibernate/中的所有内容)

让我们制作EER图!繁荣-没有关系?!好吧,怎么了?我查看所有表中的Foreign keys标签-什么都没有,没有一个FK。所以我查了一下DDL-啊哈!它使用KEY。因此自然就有索引(但是那些不是FK,是吗?)

enter image description here

DDL:

CREATE TABLE `order` (
  `id` bigint(20) NOT NULL,
  `changed` datetime DEFAULT NULL,
  `creation` datetime DEFAULT NULL,
  `seen` bit(1) NOT NULL,
  `uuid` binary(255) DEFAULT NULL,
  `client_id` bigint(20) DEFAULT NULL,
  `issuer_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKhqad2xyyn10pct9vramixbm8n` (`client_id`),
  KEY `FKqs4fxnjxlie9waq3cyav5e06x` (`issuer_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

实体(为简洁起见):

@Entity
@Table(name = "\"order\"")
public class Order
{
    @Id
    @GeneratedValue
    private Long id;

    private UUID uuid;

    @ManyToOne(fetch = FetchType.LAZY)
    private Client client;

    @ManyToOne(fetch = FetchType.LAZY)
    private Person issuer;

    @CreationTimestamp
    private ZonedDateTime   creation;
    private ZonedDateTime   changed;
    private boolean         seen;
}

在这种情况下,order个实体拥有@ManyToOne个关系。另一方面,我使用standard:

@OneToMany(mappedBy = "client") // Or issuer
private List<Order> orders = new ArrayList<>();

我的问题是-我如何使Hibernate也生成“真实的” Foreign Keys,可以将其反向工程为EER图(如我所述,通常是“真实的”)。 / p>

2 个答案:

答案 0 :(得分:1)

您已选择将MyISAM用作存储引擎which does not support foreign keys。 例如,您必须切换到InnoDB存储引擎。

为了明确切换到Hibernate MySQL InnoDB方言,您设置了hibernate.dialect.storage_engine=innodb

Found that hint at MySQLInnoDBDialect

答案 1 :(得分:0)

基于Selaron的答案,我想总结一下并添加更多内容:

默认情况下,which doesn't support foreign keys默认使用MyISAM DB引擎。解决方案是指定这样做的InnoDB。您可以执行以下操作:

hibernate.dialect.storage_engine=innodb

另外,由于我使用的是Spring Boot,因此您可以执行以下操作:

application.properties:

spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

如果有人要查找自定义FK名称(而不是我的问题中的随机名称)或对FK有更多控制权,则:

@JoinColumn(foreignKey = @ForeignKey(name = "FK_custom"))
@ManyToOne(fetch = FetchType.LAZY)
private Client client;