Hibernate @ManyToMany использует только FK из таблицы-владельца для удаления записей в таблице соединений - PullRequest
1 голос
/ 11 июля 2011

У меня есть @ManyToMany отношение Author и Source сущностей, где Author является владельцем сущности. Когда я удаляю автора, все в порядке, и hibernate генерирует Hibernate: delete from author_source where author=?. Но когда я удаляю источник, Hibernate генерирует один и тот же запрос для каждого вхождения authorId в таблице author_source, которая имела связь с удаленным источником. Таким образом, этот запрос также удаляет связь между другими источниками (если у автора было два источника, оба соединения удаляются).

Автор лица:

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

    @Id
    @Column(name = "authorId")
    @GeneratedValue
    private Integer authorId;

    @SourceFormat // own formatter 
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
            name = "author_source",
            joinColumns = { @JoinColumn(name = "author") },
            inverseJoinColumns = { @JoinColumn(name = "source") }
    )
    private Set<Source> sources;
}

Исходный объект:

@Entity
@Table(name = "source")
public class Source implements Serializable {

    @Id
    @Column(name = "sourceId")
    @GeneratedValue
    private Integer sourceId;

    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "sources")
    private Set<Author> authors;
}

Я хочу, чтобы Hibernate генерировал

delete from author_source where author=?

запрос при удалении автора и

delete from author_source where source=?

при удалении источника. Это возможно или мне нужно делать это вручную?

1 Ответ

0 голосов
/ 11 июля 2011

Возможно, попытайтесь определить объединяющую таблицу в обеих сущностях.

Убедитесь, что joinColumn и inverseJoinColumn являются противоположностями на противоположных сторонах отношения.

  • joinColumn с одной стороны == inverseJoinColumn с другой стороны
  • inverseJoinColumn с одной стороны == joinColumn с другой стороны

.

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

  ...

  @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  @JoinTable(name="author_source",
        joinColumns=@JoinColumn(name="author_id"),
        inverseJoinColumns=@JoinColumn(name="source_id")
  )
  private Set<Source> sources;

}

@Entity
@Table(name = "source")
public class Source extends Serializable {

  ...

  @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  @JoinTable(name="author_source",
        joinColumns=@JoinColumn(name="source_id"),
        inverseJoinColumns=@JoinColumn(name="author_id")
  )
  private Set<Author> authors;

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