JPA 无法从实体自动生成 table

JPA failed to automatically generate a table from an entity

我将 Eclipselink 与 Derby 数据库一起使用,以从实体自动生成数据库。

这一代一开始工作得很好,但是当我将一个用户实体添加到我的模型并尝试使用 JPA 工具从实体生成 table 时,所有 table 都生成了,除了用户 table & 我在生成过程中收到以下错误

[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;
    }

谁能告诉我为什么会出现异常?

提前致谢

这很可能是因为 USER 是 Derby 数据库中的一个函数(请参阅:http://db.apache.org/derby/docs/10.10/ref/rrefsqlj42476.html)。您可以将 JPA bean 作为 User ,但使用 @Table annotation

指定不同的 table 名称

您的 table 名称是 "USER",这是 SQL(以及 Apache Derby)中的保留关键字。一些 JPA 提供程序(例如 DataNucleus JPA)会自动为您引用此类关键字,这意味着它可以正常工作。其他(例如 EclipseLink)不这样做,因此您必须显式设置带有引号 (') 的 table 名称或将 table 名称设置为不是 SQL 关键字的名称

@Table(name="'User'")
public class User {...}