1
私は以下のテーブルを持っています:BOOK、AUTHOR、AUTHOR_BOOK。 AUTHOR_BOOKは、本と著者の多対多の関係を参照するために使用され、author_idとbook_idの2つのフィールドを保持します。EntityManager.remove()は削除クエリを生成せず、エンティティを削除しません
私のテストプログラムでは、データベースにない新しい著者を追加してから、サービス実装で新しい本を検索しました。返されたBookオブジェクトは正しいですが、試したときに私のサービスで私のdeleteBook()メソッドに渡すと、本は削除されず、ログには削除されたSQLも生成されませんでした。私は何が悪かったのか全くわから:(
ここクラスファイル(私が関連していると思うだけ掲載パーツ)
@Entity
@Table(name = "book")
@NamedQueries({
@NamedQuery(
name = "Book.findAllWithDetails",
query = "select distinct b from Book b left join fetch b.authors a left join fetch b.category c"
),
@NamedQuery(
name = "Book.findBookById",
query = "select distinct b from Book b left join fetch b.authors a left join fetch b.category c where b.id = :id"
)
})
@SqlResultSetMapping(
name = "bookResult",
entities = @EntityResult(entityClass = Book.class)
)
public class Book {
private Long id;
private String isbn;
private String title;
private Float price;
private Category category;
private Set<Author> authors = new HashSet<>();
public Book() { }
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "author_book",
joinColumns = @JoinColumn(name = "book_id"),
inverseJoinColumns = @JoinColumn(name = "author_id"))
public Set<Author> getAuthors() {
return authors;
}
public void setAuthors(Set<Author> authors) {
this.authors = authors;
}
public void addAuthor(Author author) {
authors.add(author);
//author.addBook(this);
}
public void removeAuthor(Author author) {
authors.remove(author);
//author.removeBook(this);
}
}
@Entity
@Table(name = "author")
public class Author {
private Long id;
private String firstName;
private String lastName;
private String description;
private Set<Book> books = new HashSet<>();
public Author() { }
@ManyToMany
@JoinTable(name = "author_book",
joinColumns = @JoinColumn(name = "author_id"),
inverseJoinColumns = @JoinColumn(name = "book_id"))
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
// public void addBook(Book book) {
// getBooks().add(book);
// }
//
public void removeBook(Book book) {
getBooks().remove(book);
}
}
Service("jpaPublishingService")
@Repository
@Transactional
public class PublishingServiceImpl implements PublishingService {
private final String ALL_BOOK_NATIVE_QUERY = "select id, title, isbn, price, category_id from book";
private static Logger logger = LoggerFactory.getLogger(PublishingServiceImpl.class);
@PersistenceContext
private EntityManager em;
// use namedQuery
@Override
@Transactional(readOnly = true)
public List<Book> findAllBooksWithDetails() {
return em.createNamedQuery("Book.findAllWithDetails", Book.class).getResultList();
}
// use namedQuery
@Override
@Transactional(readOnly = true)
public Book findBookByIdWithDetails(Long id) {
TypedQuery<Book> query = em.createNamedQuery("Book.findBookById", Book.class);
query.setParameter("id", id);
return query.getSingleResult();
}
// save using JPA2
@Override
public Book createNewBook(Book book) {
if (book.getId() == null) {
logger.info("Inserting new book");
em.persist(book);
} else {
em.merge(book);
logger.info("Updating existing book");
}
logger.info("Book saved with id: " + book.getId());
return book;
}
// delete using JPA2
@Override
public void deleteBook(Book book) {
Book mergedBook = em.merge(book);
em.remove(mergedBook);
logger.info("Book with id: " + mergedBook.getId() + " deleted successfully");
}
}
せてくださいがあるがありませんので、また、すべての私のログでのエラーや例外はありませんでした何か他のものが必要な場合は私が知っている。おかげで任意の助けのために!
私がしようとしたが、それを出力ANエラー "java.lang。 IllegalArgumentException:デタッチされたインスタンスを削除するcom.yzhan.bookapp.domain.Book " – yzhan
本当に申し訳ありません、私はem.findを忘れました –