Я использую Spring-Boot
, Hibernate
и MariaDB
. У меня есть сущность book
и сущность author
, и я сопоставил их с таблицей book_authors
через двунаправленную ассоциацию @manytomany
. Таблица объединения создается с соответствующими ограничениями внешнего ключа, но когда я добавляю автора, а затем книгу в соответствующие таблицы, таблица объединения не заполняется. У меня ddl-auto
установлено validate
, поэтому таблица не перезаписывается. Я вижу оператор sql join, сгенерированный hibernate, и когда я запускаю его вручную, он вытягивает нужные столбцы, но я никогда не вижу оператора вставки. Я также пробовал несколько разных комбинаций CascadeTypes, но не уверен, почему hibernate не сохраняет данные.
Первоначально каждый объект управлялся отдельным микросервисом, bookmsvc
и authormsvc
, но после проблем с ассоциацией manytomany
обе сущности дублируются на оба микросервиса. Я не уверен, если это необходимо или лучшая практика. Мой рабочий процесс:
- Запустите authormsv c, таблицы созданы.
- Запустите bookmsv c, таблицы удалены и созданы заново.
- Убейте обе службы, измените ddl-auto для проверки и перезапустите микросервисы.
- Вставьте автора через вызов API.
- Вставьте книгу через вызов 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)