Однонаправленный @OneToMany с @JoinTable не обновляет таблицу соединений - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь добиться однонаправленного отображения один-ко-многим, используя Spring Boot, JPA, QueryDsl и в базе данных H2 памяти.Когда я вставляю данные через файл schema.sql, отношение извлекается правильно.Проблема при сохранении нового объекта в таблице событий.

Schema.sql

CREATE TABLE tag (
  tag_id  INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  label   VARCHAR(25)
);

CREATE TABLE event (
  event_id       INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  owner_id       INTEGER NOT NULL,
  place_id       INTEGER NOT NULL,
  content        TEXT,
  thumbnail      VARCHAR(100),
  heading        VARCHAR(50),
  date_added     DATE,
  start_date     DATE,
  start_time     TIME,
  end_date       DATE,
  end_time       TIME,
  approved       BOOL,
  FOREIGN KEY (owner_id) REFERENCES user (user_id),
  FOREIGN KEY (place_id) REFERENCES place (place_id)
);

CREATE TABLE event_tag (
  event_id   INTEGER NOT NULL,
  tag_id     INTEGER NOT NULL,
  PRIMARY KEY (event_id,tag_id),
  KEY fk_event (event_id),
  KEY fk_tag (tag_id),
  CONSTRAINT fk_tag FOREIGN KEY (tag_id) REFERENCES tag (tag_id),
  CONSTRAINT fk_event FOREIGN KEY (event_id) REFERENCES event (event_id)
)

Event.java

@Entity
@Getter
@Setter
@EqualsAndHashCode
@Table(name = "event")
public class Event implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "event_id")
    protected Long id;

    ...

    //todo: not working while saving
    @OneToMany(cascade=CascadeType.ALL)
    @JoinTable(
            name = "event_tag",
            joinColumns = @JoinColumn(name = "event_id"),
            inverseJoinColumns = @JoinColumn(name = "tag_id")
    )
    private Set<Tag> tags;

    ...
}

Tag.java

@Entity
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
@Table(name = "tag")
public class Tag implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "tag_id")
    private Long id;

    @Column(name = "label")
    private String label;
}

И тогда я сохраняю Событие в сервисе EventService.java

public Optional<Event> create(Event event) {
    try {
        entityManager.unwrap(Session.class).save(event);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return Optional.ofNullable(event);
}

. В этот момент существует связь между Тегом и Событием с объектом Event Tags are related to the Event Object

Я никогда не получаю никакой ошибки.После сохранения объекта сеансом присоединяющаяся таблица остается неизменной.Таблица событий расширяется с помощью вновь сохраненного объекта.

Также мое application.properties:

spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.h2.console.enabled=true

Чего мне не хватает?Любая помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 14 декабря 2018

Вы не выполняете flush () после сохранения, поэтому никакие операторы SQL не генерируются.

Либо вызовите flush (), либо убедитесь, что create () выполняется в контексте транзакции.

...