Hibernate генерирует DDL с KEY вместо FOREIGN KEY в MySQL - PullRequest
0 голосов
/ 27 ноября 2018

Я спроектировал модель в JPA (Hibernate).

Все работает очень хорошо.

Затем я запустил Workbench и фактически посмотрел на схему.

Все также выглядит оченьхорошо с первого взгляда (я следил за всем из документов и https://vladmihalcea.com/tutorials/hibernate/)

Давайте сделаем EER Diagram! Бум - никаких отношений ?! Хорошо, что случилось? Я смотрю на вкладку 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 sС другой стороны, я использую стандарт:

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

Мой вопрос - , как мне заставить Hibernate также генерировать "реальные" Foreign Keys, которые могут быть преобразованы в EER Diagram (и вообще быть "реальным", как я уже говорил).

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Основываясь на ответе Селарона, я хотел бы подвести итог и добавить еще:

Видимо, по умолчанию используется движок БД MyISAM , который не поддерживает внешние ключи .Решение состоит в том, чтобы указать 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;
0 голосов
/ 27 ноября 2018

Вы выбрали MyISAM в качестве механизма хранения , который не поддерживает внешние ключи .Вам, например, придется переключиться на механизм хранения InnoDB.

Чтобы явно переключиться на Hibernate MySQL InnoDB Dialect, вы можете установить hibernate.dialect.storage_engine=innodb.

Обнаружено, что подсказка наMySQLInnoDBDialect

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...