我正在使用Eclipselink和Derby数据库从Entities自动生成数据库。
这一代最初工作得很好,但是当我向我的模型添加一个User实体并尝试使用JPA工具从实体生成表时,除User表和&之外的所有表都生成了。我在生成期间收到以下错误
[EL Warning]: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "USER" at line 1, column 14.
Error Code: 30000
这是用户实体
@NamedQuery( name = "User.findByUsername", query = "SELECT u FROM User u WHERE u.username = :userneme AND u.password = :password" )
@Entity
public class User implements Serializable {
@Transient
private static final long serialVersionUID = 1L;
public User() {
super();
}
@Id
@GeneratedValue( strategy = GenerationType.AUTO )
private Integer id;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername( String username ) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword( String password ) {
this.password = password;
}
有谁能告诉我为什么我会得到例外?
提前致谢
答案 0 :(得分:2)
您的表名是"USER"
,它是SQL(以及Apache Derby中)的保留关键字。一些JPA提供程序(例如DataNucleus JPA)会自动为您引用这些关键字,这意味着它只会起作用。其他人(例如EclipseLink)不这样做,因此您必须使用周围的引号(')显式设置表名,或者将表名设置为不是SQL关键字的表名
@Table(name="'User'")
public class User {...}
答案 1 :(得分:1)
这很可能是因为USER是Derby数据库中的一个函数(请参阅:http://db.apache.org/derby/docs/10.10/ref/rrefsqlj42476.html)。您可以将JPA bean作为User,但使用@Table注释指定不同的表名