Как правильно обновить отношение n-to-m в загрузке Spring и JPA? - PullRequest
1 голос
/ 24 июня 2019

У меня есть 2 сущности foo и bar в отношении n-to-m. Вот Фу:

@Entity
@Table(name = "foo")
public class Foo implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "name")
    private String name;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.DETACH)
    @JoinTable(
            name = "foo_bars",
            joinColumns = {@JoinColumn(name = "foo_name", referencedColumnName = "name")},
            inverseJoinColumns = {@JoinColumn(name = "bar_name", referencedColumnName = "name")}
    private Set<Bar> bars;

    public Foo() {}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Bar> getBars() {
        return bars;
    }

    public void setBars(Set<Bar> bars) {
        this.bars = bars;
    }

}

а это Бар:

@Entity
@Table(name = "bar")
public class Bar implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "name")
    private String name;

@ManyToMany(mappedBy = "bar", fetch = FetchType.EAGER)
@JsonIgnore
private Set<Foo> foos;

    public Bar() {}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Foo> getFoos() {
        return foos;
    }

    public void setFoos(Set<Foo> foos) {
        this.foos = foos;
    }

}

Итак, мое отношение называется foo_bars со столбцами foo_name,bar_name. Как мне обновить строки в foo_bars?

РЕДАКТИРОВАТЬ: например. Как добавить определенный Foo в существующую панель с именем 'xyz'? Моя попытка не сохраняется новая запись foo_bars:

Foo newFoo = new Foo();
newFoo.setName("a new foo");
newFoo.setBars(new HashSet());

Optional<Bar> barOpt = this.barRepository.findByName("xyz");
if (barOpt.isPresent()) {
    Bar toUpdate = barOpt.get();
    Set<Foo> foos = toUpdate.getFoos();
    foos.add(newFoo);
    toUpdate.setFoos(foos);
    this.barRepository.save(toUpdate);
}

1 Ответ

1 голос
/ 24 июня 2019

Вам не нужно обновлять таблицу напрямую.

Через ваше @ManyToMany отображение Hibernate позаботится о таблице отношений.

Поэтому, когда вы добавляете или удаляете объекты в коллекцию или из нее, Hibernate обновит записи.

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