私は2つのテーブルを持っています。 Book
およびCategory
である。 書籍には複数のカテゴリがあり、カテゴリには書籍のリストを含めることはできますか?そこで、新しい表category_book
を作成してManyToMany関係を作成し、book_id(fk)とcategory_id(fk)のみを作成します。JPA永続ManyToManyエラーデータベースが選択されていません
のMy Bookエンティティ:
@Id
@Column(name = "book_id", nullable = false)
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private int bookId;
@ManyToMany
@JoinTable(name = "category_book", joinColumns = @JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "category_id"))
private List<CategoryEntity> categoriesList;
...other basic attributes and constructors and getters and setters.....
マイカテゴリーエンティティ:
@Id
@Column(name = "category_id", nullable = false)
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private int categoryId;
@ManyToMany(mappedBy = "categoriesList", cascade = CascadeType.PERSIST)
private List<BookEntity> bookEntityList;
新しい本を追加するサーブレット(カテゴリーはすでに前に別々に追加しました。)
String[] category= request.getParameterValues("checkbox_category");
List<CategoryEntity> categoryEntityList = new ArrayList<>();
BookEntity newbook = new BookEntity();
for(String s: category){
CategoryEntity categoryEntity2 = new CategoryEntity();
categoryEntity2.setCategoryId(Integer.parseInt(s));
categoryEntityList.add(categoryEntity);
}
newbook.setCategories(categoryEntityList);
bookSessionBean.addBook(newbook);
BookSessionBean:
public void addBook(BookEntity book){
em.persist(book);
}
多くのトピックを確認しましたが、問題を解決できませんでした。エラーは表示され続けます。
Internal Exception: java.sql.SQLException: No database selected
Error Code: 1046
Call: INSERT INTO category_book (category_id, book_id) VALUES (?, ?)
bind => [2 parameters bound]
Query: DataModifyQuery(name="categoriesList" sql="INSERT INTO category_book (category_id, book_id) VALUES (?, ?)")
または
Error Code: 1046
Call: ALTER TABLE category_book ADD CONSTRAINT FK_category_book_category_id FOREIGN KEY (category_id) REFERENCES book.category (category_id)
Query: DataModifyQuery(sql="ALTER TABLE category_book ADD CONSTRAINT FK_category_book_category_id FOREIGN KEY (category_id) REFERENCES book.category (category_id)")
他のすべてのものは、成功しただけで、この多対多の原因のトラブルを持続することができます。
UPDATE:接続URL jdbcのためではありません。接続プールを使用してデータベースを取得していますが、正しいです。私が関連するすべての@ManyToMany関係を削除すると、正常に実行されます。しかし今回は、ManyToMany関係を使用する必要があります。
persistence.xmlファイル:
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/book</jta-data-source>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
</properties>
UPDATE 2:私はちょうど明確に確認してください、私はそれが完璧に働いている、すべての多対多関連を削除しようとしたが、私は再び@ManyToManyを追加するので、それは多くのエラーを与えます(まだ新しいテーブルを追加することも、新しいテーブルを追加することもできません)
この問題を解決する方法はまだありません。私は間違って何かしていますか?
書籍を保存するときに 'Book'ではなく' Category'を永続化するときにのみカスケードするので、 '@ ManyToMany'関係でエンティティを添付する必要があります。 – Smutje
カスケードを削除するか両方を追加すると、エラーが発生します。エラーコード:1046 呼び出し:ALTER TABLE category_book ADD CONSTRAINT FK_category_book_category_id FOREIGN KEY(category_id)参照book.category(category_id) –
永続性を使用してDDLを自動的に生成するようですこれは私の提案とは関係がありません。 – Smutje