我有2张桌子。 Book
和Category
。
一本书可以有多个类别,一个类别可以有一个书籍列表,对吧?所以我创建了一个新表category_book
来建立一个ManyToMany关系,其中只包含book_id(fk)和category_id(fk)。
My Book Entity:
@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)")
所有其他事情都能成功地存在,只有这么多很多事情都会引起麻烦。
更新:这不是因为连接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
)
仍然没有找到解决这个问题的方法。我做错了吗?
答案 0 :(得分:2)
嗯,这只能说明你没有正确配置persistance.xml。
连接网址的样子如下:
"jdbc:databaseType://ip:port/databaseName"
example: "jdbc:mysql://localhost:3306/books"
答案 1 :(得分:0)
所以,经过数小时和数小时的互联网研究后,问题是什么,但没有任何帮助。然后在某些时候我试图查看错误消息,问题是我发现很难理解的问题,没有其他地方提到它。
错误No Database Selected是由于@ManyToMany @JoinTable注释中的name列。我需要放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。
现在一切正常,正在运行。