Менеджер сущностей слияния генерирует удаление для отображения многих ко многим - PullRequest
0 голосов
/ 15 июня 2019

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

Увидел, что это происходит на работе. Затем настройте более простую настройку, чтобы увидеть, происходило ли там и было ли это

В представленном случае цель состоит в том, чтобы обновить название книги, которая в настоящее время связана с автором.

    @Entity
    public class Book {
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "book_author", 
      joinColumns = { @JoinColumn(name = "fk_book") }, 
      inverseJoinColumns = { @JoinColumn(name = "fk_author") })
    private Set<Author> authors = new HashSet<Author>();
    }

    @Entity
    public class Author {

    @ManyToMany(mappedBy="authors" )
    private Set<Book> books = new HashSet<Book>();

    }


  //junit test
  @Test
  public void mergeBooks01() {
    bookList = new ArrayList<Book>();
    bookList = appDataAccess.findAllBooks();
    for(Book b1 : bookList) {
      System.out.println(b1.toString());
    }
    bookList = new ArrayList<Book>();
    Book b = new Book();
    b = new Book();
    b.setId(1L);
    b.setTitle("u1");
    bookList.add(b);
    appDataAccess.mergeBooks(bookList);
    bookList = appDataAccess.findAllBooks();
    for(Book b1 : bookList) {
      System.out.println(b1.toString());
    }
  }


    dao call
    public void mergeBooks(List<Book> bookList) {
    for(Book b : bookList) {
      em.merge(b);
    }
      }

вот данные до:

Book [id=1, title=It, authors=[Author [id=1, firstName=Stephen, lastName=King]]]
Book [id=2, title=Misery, authors=[Author [id=1, firstName=Stephen, lastName=King]]]
Book [id=3, title=The Shining, authors=[Author [id=1, firstName=Stephen, lastName=King]]]
Book [id=4, title=Watchers, authors=[Author [id=2, firstName=Dean, lastName=Koontz]]]
Book [id=5, title=Odd Thomas, authors=[Author [id=2, firstName=Dean, lastName=Koontz]]]
Book [id=6, title=Illuminae, authors=[Author [id=3, firstName=Amie, lastName=Kaufman], Author [id=4, firstName=Jay, lastName=Kristoff]]]
Book [id=7, title=Beautiful Creatures, authors=[Author [id=6, firstName=Margaret, lastName=Stohl], Author [id=5, firstName=Kami, lastName=Garcia]]]

вот данные после

Book [id=1, title=FireStarter, authors=[]]
Book [id=2, title=Misery, authors=[Author [id=1, firstName=Stephen, lastName=King]]]
Book [id=3, title=The Shining, authors=[Author [id=1, firstName=Stephen, lastName=King]]]
Book [id=4, title=Watchers, authors=[Author [id=2, firstName=Dean, lastName=Koontz]]]
Book [id=5, title=Odd Thomas, authors=[Author [id=2, firstName=Dean, lastName=Koontz]]]
Book [id=6, title=Illuminae, authors=[Author [id=3, firstName=Amie, lastName=Kaufman], Author [id=4, firstName=Jay, lastName=Kristoff]]]
Book [id=7, title=Beautiful Creatures, authors=[Author [id=5, firstName=Kami, lastName=Garcia], Author [id=6, firstName=Margaret, lastName=Stohl]]]

в консоли Eclipse видит


    Hibernate: 
    select
        authors0_.fk_book as fk_book2_2_0_,
        authors0_.fk_author as fk_autho1_2_0_,
        author1_.id as id1_0_1_,
        author1_.first_name as first_na2_0_1_,
        author1_.last_name as last_nam3_0_1_ 
    from
        book_author authors0_ 
    inner join
        author author1_ 
            on authors0_.fk_author=author1_.id 
    where
        authors0_.fk_book=?
    Hibernate: 
    update
        book 
    set
        title=? 
    where
        id=?
    Hibernate: 
    delete 
    from
        book_author 
    where
        fk_book=?
    2019-06-14 22:11:47.229  INFO 12600 --- [           main] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory

Проблема в последнем утверждении удаления .. почему это происходит?

Не обращайте внимания на авторов [], ссылка была удалена, поэтому не может ссылаться на нее

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