JPA无法从实体自动生成表

时间:2016-09-24 15:10:58

标签: jpa eclipselink derby

我正在使用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;
    }

有谁能告诉我为什么我会得到例外?

提前致谢

2 个答案:

答案 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注释指定不同的表名