2013-04-19 3 views
2

JPA 및 SQlite에 문제가 있습니다.JPA, SQlite 해당 테이블 없음 : SEQUENCE

나는 테이블에서 엔티티를 만들었습니다. 내가 오류 다음 얻을 몇 가지 테스트 오브젝트를 지속하려고 할 때

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

:

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) 

(나는 문제없이 MySQL을 동일한 코드를 실행 한) 내가 어떻게 할 수처럼 내 생성 된 엔티티 보인다 이 문제를 해결 하시겠습니까? 표를 기본값으로

+0

는 더 GenerationType.ID 없습니다. 실제 코드는 무엇입니까? –

+0

실제 코드의 실제 내용 : @GeneratedValue (strategy = GenerationType.AUTO) – zennon

+0

GenerationType을 IDENTITY로 변경하면이 오류가 발생합니다. 예외 설명 : SEQ_GEN_IDENTITY : Platform DatabasePlatform이 NativeSequence를 지원하지 않습니다. – zennon

답변

4

IDENTITY은 IDENTITY는 데이터베이스 플랫폼에서 지원되지 않습니다. 테이블

당신은 순서 테이블 생성이 필요합니다. ElipseLink에서 테이블을 만들면 테이블이 자동으로 생성됩니다. 그렇지 않으면 테이블을 직접 만들어야합니다. SQLite는이 IDENTITY 지원이있는 경우

, 당신은 신원 지원을 추가 자신의 DatabasePlatform 서브 클래스를 생성 할 수 있습니다.

내가 IDENTITY를 사용하는 것이 좋습니다, 그것은 사전 할당을 지원하지 않습니다 않을 것입니다 및 성능 저하로 이어질 것입니다 일반적으로

.

3

SQLite는 대체 자동 증가 필드

에 대한 테이블 sqlite_sequence을 사용

@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' 요소를 추가하면됩니다 ([here] (http://stackoverflow.com/questions/20573547 참조)). – 5agado

관련 문제