我在JPA(休眠)中设计了模型。
一切正常。
然后我启动了Workbench,并实际上查看了架构。
乍一看一切都很好(我遵循了文档和https://vladmihalcea.com/tutorials/hibernate/中的所有内容)
让我们制作EER图!繁荣-没有关系?!好吧,怎么了?我查看所有表中的Foreign keys
标签-什么都没有,没有一个FK。所以我查了一下DDL-啊哈!它使用KEY
。因此自然就有索引(但是那些不是FK,是吗?)
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>
答案 0 :(得分:1)
您已选择将MyISAM用作存储引擎which does not support foreign keys。 例如,您必须切换到InnoDB存储引擎。
为了明确切换到Hibernate MySQL InnoDB方言,您设置了hibernate.dialect.storage_engine=innodb
。
答案 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;