[英]Java persistence eclipselink mysql example: error in sql syntax
我有一本简单的课本:
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;
}*/
}
这是Main类,我只是在其中尝试将书存储在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文件设置正确,因为如果我尝试保存一些其他类(例如,用户),该文件将起作用...但是,这不适用于书籍。 这是我得到的例外:
[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 ...为什么不起作用?
您可以使用以下方法来代替修改列名:
@Column(name = "`read`")
private boolean read;
您必须更改在实体类中read
的字段的列名。
尝试这个:
@Column(name="isread")
private boolean read;
或直接在Java中更改它;或者
private boolean isRead;
不幸的是, READ
是mysql中的保留字。
如果使用任何保留字来命名字段,则eclipseLink生成的SQL将具有无效的语法(错误代码:1064)。
由于某种原因,我无法对此发表评论,所以很抱歉,如果这不是提前解决的问题,但是您似乎想在该行中添加值1
VALUES ('Stephen King', 'bg5dvc8', 1, '2913-12-25'
MySQL不会在数据库中添加任何不带有“(引号)”的内容。 因此,尝试添加以下内容:
VALUES ('Stephen King', 'bg5dvc8', '1', '2913-12-25'
如您所见,我所做的只是在1周围加上一对引号,尝试添加该引号,看看它是否会改变任何内容。 MySQL的另一个很酷的部分是,如果您有权访问要添加的数据库,则可以手动将值放入数据库,然后查看代码以查看将其重新格式化为Java代码的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.