单元工作克隆sqlite中的Null或Zero Primary Key

时间:2015-06-17 18:32:10

标签: java sqlite jpa

您好我有JPA和SQLite的问题。

我在SQLite中有一个名为Category的表。这是该表的结构:

Category:
catID INTEGER Primary Key
catName TEXT

现在我正在尝试通过JPA插入新的类别。 这是我的方法:

public void insertCategory(EntityManager em, String catName) {
    Category cat = new Category();
    cat.setCatName(catName);
    em.getTransaction().begin();
        em.persist(cat);
        em.flush();
    em.getTransaction().commit();
}

现在我在em.flush()上有一个Execption。 例外说

Null or zero primary key encountered in UnitOfWork clone

我知道这是因为Object cat而发生的。 catID仍为null。 该课程如下:

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

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

    @Id
    @Column(name="catID")
    private Integer catID;
    + Getter and Setter
}

当查询中没有给出时,SQLite会自动增加主键。如何在不收到此异常的情况下通知我的程序主键运行?

1 个答案:

答案 0 :(得分:1)

谢谢Mick Mnemonic的帮助。你给出的最后一个答案对我有帮助。 我必须生成我的数据库new并将autoincrement Argument添加到我的主键。然后生成sqlite_sequence表。现在我可以通过JPA在我的数据库中插入实体而不会出现任何异常。

这是我的生成器注释:

@GeneratedValue(generator="sqlite")
@TableGenerator(name="sqlite", table="sqlite_sequence", 
                pkColumnName = "name", valueColumnName = "seq",
                pkColumnValue = "Section", initialValue = 1,
                allocationSize = 1)

最后两个参数是必要的,因为jpa似乎在sqlite_seq表中添加了+50,而SQLite在1处开始自动增量值。