我在JPA (Hibernate)中设计了模型。
一切都很好。
然后,我启动了Workbench,并实际研究了模式。
第一眼看上去一切都很好(我跟踪了docs和https://vladmihalcea.com/tutorials/hibernate/的所有信息)。
我们来做EER图吧!砰-没有关系?!好吧,怎么了?我查看所有表中的Foreign keys选项卡--没有,没有一个FK。所以我查了查!它使用KEY。因此,自然有索引(但它们不是FKs,对吗?)

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的关系。
@OneToMany(mappedBy = "client") // Or issuer
private List<Order> orders = new ArrayList<>();我的问题是--如何使Hibernate也生成“真实的” Foreign Keys,可以将其反向工程成EER图(并且通常是“真实的”,正如我所提到的)。
发布于 2018-11-27 15:36:04
根据Selaron的回答,我想总结一下,并补充一些:
显然,默认情况下,MyISAM DB引擎是使用不支持外键的。解决方案是指定InnoDB。你可以这样做:
hibernate.dialect.storage_engine=innodb另外,由于我使用的是Spring,所以您可以这样做:
application.properties:
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect另外,如果有人会寻找自定义的FK名称(而不是我的问题中的随机名称),或者更多地控制FKs:
@JoinColumn(foreignKey = @ForeignKey(name = "FK_custom"))
@ManyToOne(fetch = FetchType.LAZY)
private Client client;发布于 2018-11-27 15:22:19
您已经选择使用MyISAM作为存储引擎不支持外键的。例如,您必须切换到InnoDB存储引擎。
为了显式切换到Hibernate MySQL InnoDB方言,您可以设置hibernate.dialect.storage_engine=innodb。
https://stackoverflow.com/questions/53502151
复制相似问题