2011-12-26 3 views
3

나는 SEQUENCE 전략을 사용하여 자동으로 ID를 생성하려고하지만, 작동하도록 내 머리를 부러 뜨리고 있습니다. 나는 왜 그런 일이 일어나지 않을지 전혀 모른다.JPA가 내 행의 ID를 자동으로 생성하지 않는 이유는 무엇입니까?

이것은 내가하는 일입니다. 내가 그것을 매핑이있는 persistence.xml을에서

@Entity 
@SequenceGenerator(name="VlasnikSeq", sequenceName="VLA_SEQ") 
public class Vlasnik implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="VlasnikSeq") 
    private Long id; 
    //... 

:

enter image description here :

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="sampleAplication"> 
    <class>entities.Vlasnik</class> 
    <class>entities.Ljubimac</class> 
    </persistence-unit> 
</persistence> 

난 일식이 엔티티 테이블을 생성하는 기능을 사용하여 내가이 얻을 먼저 내가 엔티티가

볼 수 있듯이 테이블이 만들어졌지만 SEQUENCE 테이블은 없습니다. JPA가 테이블을 작성하는 동안 나는 또한, 콘솔, 다음과 같은 메시지에 주목 : 내가 할

[EL Warning]: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLSyntaxErrorException: SEQUENCE 'VLA_SEQ' does not exist.

다음 생각은 응용 프로그램을 실행하고 난 일부 행을 만들 수 있는지 확인하려고합니다. 내가 뭔가를 지속하려고 할 때, 나는 말한다 예외가 얻을 :

org.apache.derby.client.am.SqlException: SEQUENCE 'VLA_SEQ' does not

그래서 내가 어떤 이유로 내가 그 테이블이 필요하다는 결론에 도달을, 그래서는 데이터베이스 관리 측면에 가서 내가 실행하려고 다음 쿼리 :

CREATE SEQUENCE VLA_SEQ; 

그러나 나는 다음과 같은 메시지가 얻을 :

Sequence 'VLA_SEQ' already exists.

나는 완전히 혼란 스러워요합니다. 나는 무엇을해야하는지 모른다. DB에 새 행이 만들어지면 내 엔터티의 ID를 자동으로 생성하기 만하면됩니다.

글래스 피쉬 3.1을 처음 사용하는 것은 3.0 버전에서 기억이 안납니다.이 문제는 @GenneratedValue 만 사용할 수도 있습니다. 몇 가지 도움을 주셔서 감사합니다.

+0

@GeneratedValue 주석에서 ID 생성 전략을 지정해 보았습니까? –

+0

@Olivier Croisier 예 AUTO와 SEQUENCE를 묶었지만 작동하지는 않았습니다. 실제로 각 전략의 차이점을 이해하지 못했습니다. – sfrj

+0

AUTO는 자동으로 SEQUENCE로 설정되어 있습니다. 설정이 제대로 작동하지 않습니다. TABLE을 시도해보고 변경 사항이 있는지 확인할 수 있습니까? –

답변

7

GeneratedValue을 사용하려면 전략과 생성기를 지정해야합니다. 기본적으로 전략은 AUTO이고 생성기는 비어 있습니다.입니다.

사용 가능한 전략은 GenerationType에 의해 정의된다 :

public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO }; 

가장 일반적인 방법은 SEQUENCE에게 또는 IDENTITY를 지정하는 것입니다 사용할 수 있습니다.

당신은 또한 SequenceGenerator 주석을 사용할 필요가 오라클과 HSQLDB로 SEQUENCE를 사용하는 데이터베이스
  • :

    공공 MyClass 클래스 {

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQMYCLASSID") 
    @SequenceGenerator(name="SEQMYCLASSID", sequenceName="SEQMYCLASSID") 
    private Long id; 
    

    }

자동 DDL을 사용하는 경우 JPA 공급자가 사용자를 대신하여 시퀀스를 만들 필요가 없습니다. 그런 경우가 아니라면 당신은 다음과 같이 수동으로 할 필요가 : squences를 사용하고 전략으로 IDENTITY을 지정해야 Microsoft SQL Server와 같은 ID 열을 사용하지 않는 데이터베이스의 경우

CREATE SEQUENCE SEQMYCLASSID; 
  • :

    공공 MyClass 클래스 {

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 
    

    }

  • ,
+0

TABLE 전략 (Derby DB를 사용)을 시도했지만 작동하지 않는 이유를 모르겠습니다. (내 업데이트 참조) – sfrj

+1

Derby는 10.6부터 시퀀스를 지원합니다. 테이블 생성기에 대한 시퀀스를 사용하는 것이 좋습니다. 그런 식으로 주장한다면 http://www.summa-tech.com/blog/2011/07/29/setting-up-sequential-ids-using-jpa-tablegenerator를 작성해야합니다. 테이블 생성기 역할을하는 테이블 –

+0

나는 그것을 가장 쉬운 방법으로 만들고 싶다. 방금 제안한대로 SEQUENCE로 시도했지만 새로운 예외가 발생했습니다. Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504) : org.eclipse.persistence.exceptions.DatabaseException 내부 예외 : java.sql.SQLNonTransientConnectionException : 현재 연결이 없습니다. 오류 코드 : 40000 전화 : VALUES (vlasnikGeneratorName에 대한 NEXT VALUE) 검색어 : ValueReadQuery (SQL = "VALUES은 (vlasnikGeneratorName에 대한 NEXT VALUE)")' – sfrj

관련 문제