3

我对 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() {
        }
        ------
    }

当我尝试保留一些测试对象时,我收到以下错误:(我已经在 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)

我怎么解决这个问题?

4

2 回答 2

6

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

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

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

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

于 2013-04-22T13:23:42.967 回答
3

sqlite 将表 sqlite_sequence 用于 AUTOINCREMENT 字段

代替:

@GeneratedValue(strategy=GenerationType.IDENTITY)

@GeneratedValue(generator="sqlite")
@TableGenerator(name="sqlite", table="sqlite_sequence",
    pkColumnName="name", valueColumnName="seq",
    pkColumnValue="sqliteTestTable")

如果您使用多个表,则生成器必须是唯一的名称。使用新表,没有 sqlite_sequence 记录,因此您必须自己创建。

insert into sqlite_sequence (name,seq) values ("sqliteTestTable",1);
于 2013-04-30T18:35:24.657 回答