簡體   English   中英

JPA持續存在ManyToMany錯誤未選擇數據庫

[英]JPA Persist ManyToMany Error No database selected

我有2張桌子。 BookCategory 一本書可以有多個類別,一個類別可以有一個圖書清單,對嗎? 因此,我創建了一個新表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_idcategory_id (用作外鍵),我必須將ArrayList更改為HashSet以允許重復的鍵。

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

我為CategoryEntity刪除了casdade,為BookEntity添加了層疊MERGE。

現在一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM