JPA,SQLite无此表:SEQUENCE

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)

我该如何解决这个问题?


没有GenerationType.ID。实际的代码是什么? - JB Nizet
这是实际代码中的内容:@GeneratedValue(strategy=GenerationType.AUTO) - zennon
当我将GenerationType更改为IDENTITY时,出现了以下错误:异常描述:SEQ_GEN_IDENTITY:平台DatabasePlatform不支持NativeSequence。 - zennon
2个回答

6

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

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

如果SQLite支持IDENTITY,则可以创建自己的DatabasePlatform子类,以添加IDENTITY支持。

总的来说,我永远不会建议使用IDENTITY,它不支持预分配,并且会导致性能下降。


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);

1
好建议!在我的情况下,从这个策略中派生出一个问题,即自动增量值分配大小;如果您处于相同的情况,请添加initialValue=1, allocationSize=1元素(请参见此处)。 - 5agado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接