Java JPA持久化多个错误未选择数据库

Java JPA持久化多个错误未选择数据库,java,mysql,jpa,servlets,Java,Mysql,Jpa,Servlets,我有两张桌子书籍和类别。 一本书可以有多个类别,一个类别可以有一个书的列表,对吗?因此,我创建了一个新表category\u book,以建立多个关系,其中只有book\u id(fk)和category\u id(fk) 我的图书实体: @Id @Column(name = "book_id", nullable = false) @GeneratedValue(strategy=GenerationType.SEQUENCE) private int bookId; @ManyToMan

我有两张桌子<代码>书籍和
类别
。 一本书可以有多个类别,一个类别可以有一个书的列表,对吗?因此,我创建了一个新表
category\u book
,以建立多个关系,其中只有book\u id(fk)和category\u 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.....
我检查了很多主题,但都没有解决问题。错误不断地出现

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 (?, ?)")

所有其他的事情都能成功地坚持下去,只有这么多的事情会带来麻烦

更新:这不是因为连接URL jdbc,我使用连接池来获取数据库,这是正确的。如果我删除所有与@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>
org.eclipse.persistence.jpa.PersistenceProvider
jdbc/book
更新2:我只是清楚地检查了一下,我试图删除所有与之相关的manytomy,它工作得很好,但由于我再次添加@manytomy,它会出现很多错误,即使它仍然成功部署(但无法通过servlet和服务会话bean添加新书或添加到新表
category\u book


仍然没有找到任何解决这个问题的方法。我做错什么了吗

这只能说明您没有正确配置persistence.xml

连接url的外观如下所示:

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

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

这只能说明您没有正确配置persistence.xml

连接url的外观如下所示:

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

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

所以,在互联网上花了好几个小时研究出了什么问题,但没有任何帮助。然后在某个时候,我试图查看错误消息,问题是我发现很难理解,没有其他地方提到过它

“未选择数据库”错误是由于@ManyToMany@JoinTable注释中的“名称”列引起的。我需要把
数据库名.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\u book
中我有两个主键
book\u id
category\u id
(用作外键),我必须将ArrayList更改为HashSet以允许重复的键

private Set<CategoryEntity> categoriesList = new HashSet<>();
private Set categoriesList=new HashSet();
我删除了CategoryEntity的casdade,为BookEntity添加了级联合并


现在一切都在运转

那么,在互联网上花了好几个小时研究出了什么问题,但没有任何帮助。然后在某个时候,我试图查看错误消息,问题是我发现很难理解,没有其他地方提到过它

“未选择数据库”错误是由于@ManyToMany@JoinTable注释中的“名称”列引起的。我需要把
数据库名.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\u book
中我有两个主键
book\u id
category\u id
(用作外键),我必须将ArrayList更改为HashSet以允许重复的键

private Set<CategoryEntity> categoriesList = new HashSet<>();
private Set categoriesList=new HashSet();
我删除了CategoryEntity的casdade,为BookEntity添加了级联合并


现在一切都在运转

我认为这不是问题所在。我使用连接池来加载数据库。但正如我在帖子中所说的,一切正常。我可以检索数据,持久化数据库很好。但它不仅在@ManyToMany中起作用。我更新了我的问题,包括persistence.xml。但这不是因为jdbc。它部署成功。你能帮我检查一下问题是什么吗?手动创建的category_book列I包含2个属性(category_id)和(book_id)[与两个表中的ReferenceName完全相同的名称。我需要向其添加约束fk吗?我不认为这是问题所在。我使用连接池加载数据库。但正如我在帖子中所述,一切正常。我可以检索数据,持久化数据库正常。但它不仅@ManyToMany有效。我更新了我的问题,包括持久化数据库但是这不是因为jdbc。它成功部署了。你能帮我检查一下问题是什么吗?我手工创建的category_book列包含两个属性(category_id)和(book_id)[与两个表中的ReferenceName完全相同的名称。我需要向其添加约束fk吗?您仅在持久化
类别时进行级联,而不是
书籍时进行级联,因此在保存书籍时,它应该只在其
@manytomy
关系中具有附加实体。如果我同时删除级联或同时添加这两个约束,它仍然会给出错误:错误代码:1046调用:ALTER TABLE category\U book添加约束FK\U category\U book\U category\U id外键(category\U id)引用book.category(category\U id)似乎您通过持久化提供程序自动生成DDL,但这与我的建议无关。您仅在持久化
类别时进行级联,而不是
书籍时进行级联,因此在保存书籍时,它应该只在其
@manytomy
关系中具有附加实体。如果我同时删除级联或同时添加这两个实体,它将仍然给出错误:错误代码:1046调用:ALTER TABLE category\u book ADD CONSTRAINT FK\u category\u book\u category\u id外键(category\u id)引用book.category(category\u id)看起来像是通过持久性提供程序自动生成DDL,但这与我的建议无关。
private Set<CategoryEntity> categoriesList = new HashSet<>();