2015-06-17 1 views
1

Привет, У меня есть проблема с JPA и SQLite.Null или Zero Первичный ключ в работе блока clone sqlite

У меня есть таблица под названием Категория в SQLite. Это структура этой таблицы:

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

Теперь у меня есть Execption на em.flush(). Исключение говорит

Null or zero primary key encountered in UnitOfWork clone 

Я знаю, что это происходит из-за кота объекта. Код catID по-прежнему равен нулю. Класс выглядит следующим образом: увеличивает

@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 первичного ключа автоматически, когда не дано в запросе. Как я могу сообщить моей Программе о Первичном ключе, чтобы работать без получения этого исключения?

+0

[ Эта тема] (http://stackoverflow.com/questions/22026715/jpa-null-or-zero-primary-key-encountered-in-unit-of-work-clone) может помочь. –

+0

Я пробовал это решение, но потом я стал ошибкой Exception SQL или отсутствующей базой данных (нет такой таблицы: SEQUENCE). Я думаю, что это не сработает с SQLite. – Kevin

+0

Попробуйте аннотировать 'catID' просто с' @ GeneratedValue' (без параметров). Последовательность - это концепция Oracle. –

ответ

0

Спасибо, Mick Мнемонический за вашу помощь. Последний ответ, который вы мне дали, помог мне. Мне пришлось сгенерировать новую базу данных и добавить автоинкремент Аргумент к моим Первичным ключам. Затем была создана таблица sqlite_sequence. Теперь я могу вставлять Entitys в мою базу данных через JPA без получения Исключения.

Это мой генератор Аннотация:

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

последние два аргумента необходимы потому, что JPA, кажется, добавить +50 к значению в таблице sqlite_seq и SQLite начинается значение Autoincrement в 1.