[英]JPA Persist ManyToMany Error No database selected
我有2張桌子。 Book
和Category
。 一本書可以有多個類別,一個類別可以有一個圖書清單,對嗎? 因此,我創建了一個新表category_book
來建立ManyToMany關系,其中僅包含book_id(fk)和category_id(fk)。
我的圖書實體:
@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;
用於添加新書的servlet(之前已經單獨添加的類別。)
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)")
所有其他事情都可以成功持續,只有這ManyToMany會引起麻煩。
更新:不是因為連接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>
更新2:我只是清楚地檢查,我試圖刪除所有與ManyToMany相關的,它工作正常,但是由於我又添加了@ManyToMany,所以它給出了很多錯誤,即使它仍然可以成功部署(但是不能添加新書或添加到通過servlet和服務會話bean新建表category_book
)
仍然沒有找到任何解決該問題的方法。 我做錯什么了嗎?
好吧,這僅意味着您沒有正確配置persistance.xml。
連接網址應如下所示:
"jdbc:databaseType://ip:port/databaseName"
example: "jdbc:mysql://localhost:3306/books"
因此,經過數小時的互聯網研究,問題出在哪里,但無濟於事。 然后在某個時候我試圖查看錯誤消息,問題是我發現很難理解的錯誤,沒有其他地方提到過。
錯誤“未選擇數據庫”是由於@ManyToMany @JoinTable批注中的名稱列。 我需要輸入databasename.columnname
然后它才能正常工作。 但是我在這里檢查了許多教程和一些答案/問題,它們不需要databasename
,很奇怪,對嗎? 而且,如果我使用@Column我根本不需要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_id
和category_id
(用作外鍵),我必須將ArrayList更改為HashSet以允許重復的鍵。
private Set<CategoryEntity> categoriesList = new HashSet<>();
我為CategoryEntity刪除了casdade,為BookEntity添加了層疊MERGE。
現在一切正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.