Hibernate не создает Join Table самостоятельно - PullRequest
2 голосов
/ 06 апреля 2020

Я хочу установить отношения «многие ко многим» между моими сущностями. Я хочу, чтобы hibernate генерировал эту таблицу автоматически, но этого не произойдет. Вот мои сущности:

DrugsEntity :

@Entity
@Table(name = "drugs", schema = "meds", catalog = "chinamed")
public class DrugsEntity {
    @Id
    @Basic
    @Column(name = "id")
    private int id;
    @Basic
    @Column(name = "name_eng")
    private String nameEng;

    @ManyToMany()
    @JoinTable(name = "drug_symptom",
            joinColumns = { @JoinColumn(name = "drug_id",nullable = false) },
            inverseJoinColumns = { @JoinColumn(name = "symptom_id", nullable = false) })
    private Set<SymptomEntity> symptoms;
}

Симптомы Entity:

@Entity
@Table(name = "symptom",schema = "meds", catalog = "chinamed")
public class SymptomEntity {

    @Id
    @GeneratedValue
    int id;

    @Basic
    String name;

    @Column
    @ManyToMany(mappedBy = "symptoms",cascade = CascadeType.ALL)
    Set<DrugsEntity> drugs;
}

Некоторая конфигурация:

jpa:
hibernate:
  ddl-auto: update
show-sql: true

Итак, я вижу hibernate sql запросов:

Hibernate: create table meds.diseases (disease_id int4 not null, drug_id int4, name varchar(255), primary key (disease_id))
Hibernate: create table meds.drugs (id int4 not null, action_pharm varchar(255), action_tkm varchar(255), clinic varchar(255), contraindications varchar(255), form varchar(255), maker varchar(255), name_eng varchar(255), name_ru varchar(255), taking_method varchar(255), primary key (id))
Hibernate: create table meds.herbal_drug (herbal_id int4 not null, drug_id int4, primary key (herbal_id))
Hibernate: create table meds.pattern_drug (pattern_id int4 not null, drug_id int4, primary key (pattern_id))
Hibernate: create table meds.symptom (id int4 not null, name varchar(255), primary key (id))
Hibernate: alter table if exists symptom_drug add constraint FKl7jx9kgpfiunb1r5neejqi1in foreign key (drug_id) references meds.symptom
Hibernate: alter table if exists symptom_drug add constraint FKimmnf4263cgg3yg46i90tkn1g foreign key (symptom_id) references meds.drugs
Hibernate: alter table if exists symptom_drugs add constraint FKnvs2tystmth11i573t29rtayk foreign key (drugs_id) references meds.drugs
Hibernate: alter table if exists symptom_drugs add constraint FKng4i6ig5nr2laew225ttfnrb9 foreign key (symptom_entity_id) references meds.symptom

Как я вижу, hibernate даже не пытается создать эту таблицу.

Using dialect: org.hibernate.dialect.PostgreSQL10Dialect

Как можно достичь что hibernate сам создает эту таблицу?

PS: уже посмотрел эту ссылку Hibernate не создает таблицу соединений Но это не мой случай, я полагаю.

решено: Проблема заключалась в том, что эта таблица уже была составлена. И, вероятно, я заметил кое-что интересное в запросах hibernate: перед именем таблицы drug_symptom не было префикса «meds». Так он создал таблицу в "publi c" схеме данных. Решил так: добавил default_schema

spring:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        default_schema: meds

Но также я мог использовать параметр "схема" в аннотации @ JoinTable.

1 Ответ

2 голосов
/ 06 апреля 2020

Удалите аннотацию @Column из поля «Лекарства» и определите каскадный тип для DrugsEntity.symptoms, так как он является стороной-владельцем отношений.

Аннотации @JoinTable и @ManyToMany не должны использоваться с @Column, поскольку отображение должно быть выполнено по его собственному определению. Hibernate запутывается в обеих аннотациях на одном и том же поле.

Ваше отображение должно быть:

 @Entity
 @Table(name = "drugs", schema = "meds", catalog = "chinamed")
 public class DrugsEntity {
      @Id
      @Column(name = "id")
      private int id;

     @Basic
     @Column(name = "name_eng")
     private String nameEng;

     @ManyToMany(cascade = CascadeType.ALL)
     @JoinTable(name = "drug_symptom",
        joinColumns = @JoinColumn(name = "drug_id",nullable = false),
        inverseJoinColumns = @JoinColumn(name = "symptom_id", nullable = false))
     private Set<SymptomEntity> symptoms;
 }

и

@Entity
@Table(name = "symptom",schema = "meds", catalog = "chinamed")
public class SymptomEntity {

    @Id
    @GeneratedValue
    int id;

    @Basic
    String name;

    @ManyToMany(mappedBy = "symptoms")
    Set<DrugsEntity> drugs;
}

Хорошее кодирование!

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