Hibernate - данные таблицы соединений не сохраняются - PullRequest
0 голосов
/ 21 января 2020

Я использую Spring-Boot, Hibernate и MariaDB. У меня есть сущность book и сущность author, и я сопоставил их с таблицей book_authors через двунаправленную ассоциацию @manytomany. Таблица объединения создается с соответствующими ограничениями внешнего ключа, но когда я добавляю автора, а затем книгу в соответствующие таблицы, таблица объединения не заполняется. У меня ddl-auto установлено validate, поэтому таблица не перезаписывается. Я вижу оператор sql join, сгенерированный hibernate, и когда я запускаю его вручную, он вытягивает нужные столбцы, но я никогда не вижу оператора вставки. Я также пробовал несколько разных комбинаций CascadeTypes, но не уверен, почему hibernate не сохраняет данные.

Первоначально каждый объект управлялся отдельным микросервисом, bookmsvc и authormsvc , но после проблем с ассоциацией manytomany обе сущности дублируются на оба микросервиса. Я не уверен, если это необходимо или лучшая практика. Мой рабочий процесс:

  1. Запустите authormsv c, таблицы созданы.
  2. Запустите bookmsv c, таблицы удалены и созданы заново.
  3. Убейте обе службы, измените ddl-auto для проверки и перезапустите микросервисы.
  4. Вставьте автора через вызов API.
  5. Вставьте книгу через вызов API.

Его в В этот момент я ожидаю, что таблица соединений будет заполнена. Я уверен, что есть фундаментальное недоразумение с моей стороны, но я не уверен, что это такое. Я читал, что лучше использовать две ассоциации onetomany / manytoone, но я не уверен, что это точно отражает отношения? Есть ли лучший подход к этому?

Если нет, как мне перейти в спящий режим для заполнения таблицы объединения?

Автор

@Entity
@Table(name = "author")
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

    @NotNull @Column(name = "author_name")
  private String authorName;

    @ManyToMany( mappedBy = "authors",
      fetch   = FetchType.LAZY,
      cascade = { CascadeType.PERSIST, CascadeType.MERGE })
  public List<Book> books = new ArrayList<>();

  public Author() {}

  public Long getId() {
    return id;
  }
  public String getAuthorName() {
    return authorName;
  }

  public void setId(Long id) {
    this.id = id;
  }
  public void setName(String name) {
    this.authorName = name;
  }
}

Книга

@Entity
@Table(name = "book")
public class Book {


      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

      @NotNull @Column(name = "title")
    private String title;

      @NotNull @Column(name = "pub_id")
  private Long pubId;

      @NotNull @Column(name = "auth_id")
  private Long authId;

    @ManyToMany(
      fetch   = FetchType.LAZY,
      cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinTable(name = "book_authors",
      joinColumns = {
        @JoinColumn(
            name = "book_id",
            referencedColumnName = "id"          
        )
      },
      inverseJoinColumns = {
        @JoinColumn(
            name = "auth_id",
            referencedColumnName = "id"          
        )
      })
  public List<Author> authors = new ArrayList<>();

  public Book() {}


  public Long getId() {
    return id;
  }
  public String getTitle() {
    return title;
  }
  public Long getPubId() {
    return pubId;
  }
  public Long getAuthId() {
    return authId;
  }


  public void setId(Long id) {
    this.id = id;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public void setPubId(Long pubId) {
    this.pubId = pubId;
  }
  public void setAuthId(Long authId) {
    this.authId = authId;
  }
}

SQL, сгенерированная hibernate

create table author (id bigint not null auto_increment, author_name varchar(255) not null, primary key (id)) engine=MyISAM

create table book (id bigint not null auto_increment, auth_id bigint not null, pub_id bigint not null, title varchar(255) not null, primary key (id)) engine=MyISAM

create table book_authors (book_id bigint not null, auth_id bigint not null) engine=MyISAM

alter table book_authors add constraint FKo21n38yco1hp4gvkb1xobm5vx foreign key (auth_id) references author (id)

alter table book_authors add constraint FK9s79v70m4fxo4c0qigpn5daf8 foreign key (book_id) references book (id)

select authors0_.book_id as book_id1_2_0_, authors0_.auth_id as auth_id2_2_0_, author1_.id as id1_0_1_, author1_.author_name as author_n2_0_1_ from book_authors authors0_ inner join author author1_ on authors0_.auth_id=author1_.id where authors0_.book_id=?

book_authors table

MariaDB [lms]> describe book_authors;
+---------+------------+------+-----+---------+-------+
| Field   | Type       | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| book_id | bigint(20) | NO   | MUL | NULL    |       |
| auth_id | bigint(20) | NO   | PRI | NULL    |       |
+---------+------------+------+-----+---------+-------+
2 rows in set (0.002 sec)

MariaDB [lms]> select * from book_authors;
Empty set (0.001 sec)

...