JPA、SQlite 没有这样的表:SEQUENCE

zen*_*non 3 sql sqlite jpa

我有 JPA 和 SQlite 的问题。

我从表中创建了一个实体。我生成的实体看起来像:

    @Entity
    @Table(name="sqliteTestTable")
    public class Test implements Serializable {
        private static final long serialVersionUID = 1L;

        @Id  
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="id")
        private int id;

        @Column(name="name")
        private String name;



        public Test() {
        }
        ------
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试保留一些 Test 对象时,我收到以下错误:(我在 mysql 上执行了相同的代码,没有问题)

Exception in thread "main" Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: no such table: SEQUENCE
Error Code: 0
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    bind => [50, SEQ_GEN_TABLE]
Query: DataModifyQuery(name="SEQ_GEN_TABLE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Jam*_*mes 6

如果数据库平台不支持 IDENTITY,则 IDENTITY 将默认为 TABLE。

对于 TABLE,您需要创建一个序列表。如果您让 ElipseLink 创建您的表,它将自动为您创建,否则您需要自己创建它。

如果 SQlite 具有 IDENTITY 支持,那么您可以创建自己的 DatabasePlatform 子类来添加身份支持。

一般来说,我永远不会推荐使用 IDENTITY,它不支持预分配并且会导致性能不佳。