2016-09-21 18 views
0

私は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を追加するので、それは多くのエラーを与えます(まだ新しいテーブルを追加することも、新しいテーブルを追加することもできません)

この問題を解決する方法はまだありません。私は間違って何かしていますか?

+0

書籍を保存するときに 'Book'ではなく' Category'を永続化するときにのみカスケードするので、 '@ ManyToMany'関係でエンティティを添付する必要があります。 – Smutje

+0

カスケードを削除するか両方を追加すると、エラーが発生します。エラーコード:1046 呼び出し:ALTER TABLE category_book ADD CONSTRAINT FK_category_book_category_id FOREIGN KEY(category_id)参照book.category(category_id) –

+0

永続性を使用してDDLを自動的に生成するようですこれは私の提案とは関係がありません。 – Smutje

答えて

2

これは、persistance.xmlを正しく設定していないことを意味します。接続URLは次のようになります

方法は次のとおりです。

"jdbc:databaseType://ip:port/databaseName" 

example: "jdbc:mysql://localhost:3306/books" 
+0

私はそれが問題だとは思わない。私は接続プールを使用してデータベースを読み込みます。私が記事で述べたように、すべてうまく動作します。私はデータを取得することができ、データベースは正常です。しかし、@ManyToManyだけでは動作しません。 –

+0

私の質問が更新されました。これにはpersistance.xmlも含まれています。しかし、それはjdbcのためではありません。それは正常に展開します。 –

+0

問題が何であるか私に確認できますか?手で作成したcategory_bookの列には、2つの属性(category_id)と(book_id)[2つの表のreferanceNameとまったく同じ名前が含まれています。制約fkを追加する必要がありますか? –

0

ので、時間と時間の問題だ何をインターネット上で研究し、ないヘルプの後。それから、ある時点で私はエラーメッセージを調べようとしましたが、問題は理解しにくいものであり、他の場所には言及されていません。

[データベースが選択されていません]というエラーは、@ManyToMany @JoinTableアノテーションの名前列のためです。私はdatabasename.columnnameを置く必要があります。しかし、私はここで多くのチュートリアルといくつかの答え/質問をチェックします。彼らはdatabasenameが必要です。そして、私が@列を使用する場合、私はdatabasenameを全く必要としません。

@Id 
@Column(name = "book_id", nullable = false) 
@GeneratedValue(strategy=GenerationType.SEQUENCE) 
private String bookId 

    @ManyToMany(cascade = CascadeType.MERGE) 
@JoinTable(name = "book.category_book", joinColumns = @JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "category_id")) 
//The correct one. `book` is my databasename. 

テーブルcategory_bookに、私は2つの主キーbook_idcategory_id(外部キーとして動作します)を持っているので、より正確に動作するコードを取得するには、私は、重複キーを許可するようにHashSetのにArrayListのを変更する必要があります。

private Set<CategoryEntity> categoriesList = new HashSet<>(); 

CategoryEntityのcasdadeを削除し、BookEntityのカスケードMERGEを追加します。

すべての機能が動作しています。

関連する問題