Java persistence eclipselink mysql示例:sql语法错误
我有本简单的教科书:Java persistence eclipselink mysql示例:sql语法错误,java,mysql,eclipselink,Java,Mysql,Eclipselink,我有本简单的教科书: package it.mysql.beginner; import java.util.Date; import javax.persistence.*; @Entity @Table(name = "books") public class Book implements java.io.Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(str
package it.mysql.beginner;
import java.util.Date;
import javax.persistence.*;
@Entity
@Table(name = "books")
public class Book implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(unique = true)
private String isbn;
private String author;
private String title;
private boolean read;
/*@OneToOne(cascade = CascadeType.PERSIST)
private Kind kind;*/
private String type;
@Temporal(TemporalType.DATE)
private Date riconsegna;
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isRead() {
return read;
}
public void setRead(boolean read) {
this.read = read;
}
public Date getRiconsegna() {
return riconsegna;
}
public void setRiconsegna(Date riconsegna) {
this.riconsegna = riconsegna;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
/*public Kind getKind() {
return kind;
}
public void setKind(Kind kind) {
this.kind = kind;
}*/
}
这是我尝试在mysql数据库中存储一本书的主要类:
package it.mysql.beginner;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
public class Main {
public static void main(String argv[]) {
EntityManagerFactory emf=Persistence.createEntityManagerFactory("mysqltest");
EntityManager em = emf.createEntityManager();
Date d = new Date();
d.setMonth(11);
d.setDate(25);
d.setYear(1013);
Book b1 = new Book();
b1.setAuthor("Stephen King");
b1.setIsbn("bg5dvc8");
b1.setRead(true);
b1.setRiconsegna(d);
b1.setTitle("The green mile");
b1.setType("Drammatico");
em.getTransaction().begin();
em.persist(b1);
em.getTransaction().commit();
em.close();
emf.close();
}
}
persistence.xml文件的设置是正确的,因为如果我尝试保存一些其他类(例如用户),它可以工作……但这对book不起作用。这是我得到的例外:
[EL Info]: 2013-11-18 18:22:18.456--ServerSession(7486884)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b
[EL Info]: connection: 2013-11-18 18:22:18.714--ServerSession(7486884)--file:/home/lory/workspace/BeginnerMysql/build/classes/_mysqltest login successful
[EL Warning]: 2013-11-18 18:22:18.743--ServerSession(7486884)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'READ TINYINT(1) default 0, RICONSEGNA DATE, TITLE VARCHAR(255), TYPE VARCHAR(255' at line 1
Error Code: 1064
Call: CREATE TABLE books (ID INTEGER AUTO_INCREMENT NOT NULL, AUTHOR VARCHAR(255), ISBN VARCHAR(255) UNIQUE, READ TINYINT(1) default 0, RICONSEGNA DATE, TITLE VARCHAR(255), TYPE VARCHAR(255), PRIMARY KEY (ID))
Query: DataModifyQuery(sql="CREATE TABLE books (ID INTEGER AUTO_INCREMENT NOT NULL, AUTHOR VARCHAR(255), ISBN VARCHAR(255) UNIQUE, READ TINYINT(1) default 0, RICONSEGNA DATE, TITLE VARCHAR(255), TYPE VARCHAR(255), PRIMARY KEY (ID))")
[EL Warning]: 2013-11-18 18:22:18.804--UnitOfWork(27137311)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'READ, RICONSEGNA, TITLE, TYPE) VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25' at line 1
Error Code: 1064
Call: INSERT INTO books (AUTHOR, ISBN, READ, RICONSEGNA, TITLE, TYPE) VALUES (?, ?, ?, ?, ?, ?)
bind => [6 parameters bound]
Query: InsertObjectQuery(it.mysql.beginner.Book@85a5a5)
Exception in thread "main" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'READ, RICONSEGNA, TITLE, TYPE) VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25' at line 1
Error Code: 1064
Call: INSERT INTO books (AUTHOR, ISBN, READ, RICONSEGNA, TITLE, TYPE) VALUES (?, ?, ?, ?, ?, ?)
bind => [6 parameters bound]
Query: InsertObjectQuery(it.mysql.beginner.Book@85a5a5)
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:157)
at it.mysql.beginner.Main.main(Main.java:60)
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'READ, RICONSEGNA, TITLE, TYPE) VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25' at line 1
Error Code: 1064
Call: INSERT INTO books (AUTHOR, ISBN, READ, RICONSEGNA, TITLE, TYPE) VALUES (?, ?, ?, ?, ?, ?)
bind => [6 parameters bound]
但是我没有写sql…为什么它不工作?出于某种原因,我无法对此发表评论,因此如果这不是提前的答案,我很抱歉。。。但看起来您正在尝试在行中添加值1
VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25'
MySQL不会向数据库中添加任何周围没有“”的内容。因此,请尝试添加以下内容:
VALUES ('Stephen King', 'bg5dvc8', '1', '2913-12-25'
正如您所看到的,我所做的只是在1周围加上一对引号,尝试添加它,看看它是否会改变任何东西。MySQL的另一个很酷的部分是,如果您有权访问要添加内容的数据库,您可以手动将值放入数据库,然后查看代码,看看如何将其重新格式化为Java代码。出于某种原因,我无法对此发表评论,因此如果这不是提前给出的答案,我很抱歉。。。但看起来您正在尝试在行中添加值1
VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25'
MySQL不会向数据库中添加任何周围没有“”的内容。因此,请尝试添加以下内容:
VALUES ('Stephen King', 'bg5dvc8', '1', '2913-12-25'
正如您所看到的,我所做的只是在1周围加上一对引号,尝试添加它,看看它是否会改变任何东西。MySQL的另一个很酷的部分是,如果您有权访问要添加内容的数据库,您可以手动将值放入数据库中,然后查看代码以查看如何将其重新格式化到Java代码中。您必须更改实体类中的
read
字段的列名
试试这个:
@Column(name="isread")
private boolean read;
或者直接在java中更改它
private boolean isRead;
不幸的是,READ
在mysql中是一个保留字
如果使用任何保留字命名字段,eclipseLink生成的SQL将具有无效语法(错误代码:1064)
您必须更改实体类中字段的列名
read
试试这个:
@Column(name="isread")
private boolean read;
或者直接在java中更改它
private boolean isRead;
不幸的是,READ
在mysql中是一个保留字
如果使用任何保留字命名字段,eclipseLink生成的SQL将具有无效语法(错误代码:1064)
您可以使用以下选项,而不是修改列名:
@Column(name = "`read`")
private boolean read;
您可以使用以下选项,而不是修改列名:
@Column(name = "`read`")
private boolean read;
嗯,我不认为问题是因为1应该代表“true”…如果你看到这个类有一个布尔属性…为了持久化我使用eclipselink e javax持久化,我不应该写任何sql coseEhm,我不认为问题是因为1应该代表“true”…如果你看到这个类有一个布尔属性…为了持久化书籍,我使用eclipselink e javax持久化,我不应该写任何sql coseSorry,恐怕我不明白你写了什么对不起,恐怕我不明白你写了什么…谢谢。我要试一试。我是mysql新手,因为我曾经使用postgresql…不幸的是,错误消息没有太大帮助。现在你知道下次遇到这个问题时应该朝哪个方向看了。也许还要注意日期的用法:
d.setYear(1013)代码>。如果年份低于1900,则1900将用作偏移量:1013+1900=2913。它有效!第一个公历必须使用,而不是日期,第二个我已经更改了isRead中的read属性,正如您所说的。谢谢你,朋友!谢谢你检查我的答案是否正确(绿色钩):-)。哦…谢谢。我要试一试。我是mysql新手,因为我曾经使用postgresql…不幸的是,错误消息没有太大帮助。现在你知道下次遇到这个问题时应该朝哪个方向看了。也许还要注意日期的用法:d.setYear(1013)代码>。如果年份低于1900,则1900将用作偏移量:1013+1900=2913。它有效!第一个公历必须使用,而不是日期,第二个我已经更改了isRead中的read属性,正如您所说的。谢谢你,朋友!谢谢你检查我的答案是否正确(绿色钩):-)。