2009-05-27 3 views
75

com.something.SuperClass에 ID 열 키 생성을 사용할 수 없습니다 :는 <노조 서브 클래스> (TABLE_PER_CLASS)

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class SuperClass implements Serializable { 
    private static final long serialVersionUID = -695503064509648117L; 

    long confirmationCode; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!! 
    public long getConfirmationCode() { 
     return confirmationCode; 
    } 

    public void setConfirmationCode(long confirmationCode) { 
     this.confirmationCode = confirmationCode; 
    } 
} 

com.something.SubClass을 :

@Entity 
public abstract class Subclass extends SuperClass { 
    private static final long serialVersionUID = 8623159397061057722L; 

    String name; 

    @Column(nullable = false) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

을 제공합니다 이 예외 :

Caused by: org.hibernate.MappingException: Cannot use identity column key 
generation with <union-subclass> mapping for: com.something.SuperClass 

ID를 생성하는 가장 쉽고 편리한 방법은 무엇입니까? 저는 상속 전략을 변경하고 싶지 않습니다.

답변

190

여기서 문제는 "table-per-class"상속과 GenerationType.Auto을 혼합하는 것입니다. MsSQL에서 ID 열을 고려하십시오. 그것은 컬럼 기반입니다. "table-per-class"전략에서는 클래스 당 하나의 테이블을 사용하며 각 테이블에는 ID가 있습니다.

시도 :

@GeneratedValue(strategy = GenerationType.TABLE)

+1

완벽한 솔루션. 에도 최대 절전 모드 포럼은이 솔루션을 갖고있는 것 같다 didnot, 그들은 주제 https://forum.hibernate.org/viewtopic.php?p=2319244&sid=4493aa54d27d3f81a0e27ecbdda075ae –

+1

주위에 가고 있었다이 문제는 MySQL의 전용 또는 정기 함께가요 내가 테이블 당 접근법에 대한 비디오 중 하나를 보았을 때 포스트 그레스가 사용되었다는 점에서 잘 작동했다. – Prashant

+1

최근에 Dropwizard 애플리케이션을 테스트 할 때이 문제가 발생했다. 필자의 경우에는 DW가 세션 팩토리를 생성 할 때 사용한 것과 동일한 구성 옵션을 사용하여 문제를 해결했습니다. 나는 정말로 "hibernate.id.new_generator_mappings"프로퍼티를 true로 설정하는 것이 무엇인지를 확신한다. 이것은 DW 0.7.0, Hibernate 4.3.1, DB는 H2입니다. – sfitts

6

이 내가 본 기본 데이터베이스로 PostgreSQL을 함께 유튜브 자습서를보고 있기 때문에, 데이터베이스 방언 특정 문제가 궁금 그 비디오 실행과 succefully 응용 프로그램의 창조자 디폴트 @GeneratedValue. 제 경우에는 (기본 데이터베이스는 MySQL입니다) zoidbeck이 제안하는대로 @GeneratedValue 전략을 GenerationType.TABLE로 수정해야했습니다. https://www.youtube.com/watch?v=qIdM4KQOtH8

+0

Postgres는 상속을 수행 할 수 있으므로이 데이터베이스가 맞다고 짐작할 수 있습니다 : http://www.postgresql.org/docs/8.1 /static/ddl-inherit.html 동영상이 스키마가 생성되는 방식을 설명하지 않습니다 (또는 놓쳤습니다). 그래서 아마 NHibernate postgres 사투리가 그것 자체로 그것을 할 수 있거나 대신에 당신은 수동으로 'INHERITS'를 추가해야합니다. 사실 나는 말할 수 없다. – zoidbeck

+5

PostgreSQL에서, Hibernate는 기본값으로'GenerationType.SEQUENCE'를 사용합니다. 그래서 자동으로 작동합니다. PostgreSQL의'INHERITS'와는 전혀 관련이 없습니다. – Henning

+0

나는이 게시물을 볼 때까지 동일한 튜토리얼을 사용하고 @Generated를 사용하여 MySql.Spent를 사용하여 많은 시간을 디버깅하는 문제를 일으켰습니다. –

2

우리의 경우, 우리는 디바이스 생산 및 테스트를위한 메모리 HSQLDB 데이터베이스에 대한 PostreSQL 데이터베이스를 사용 : 여기

는 동영상입니다. 두 경우 모두에서 시퀀스를 사용하여 ID를 생성합니다. 외관상으로는 GenerationType.AUTO은 포스트그레스의 경우 기본값은 SEQUENCE이지만 로컬 테스트에서는 실패합니다 (기본값은 hsqldb의 다른 항목이어야 함).

그래서 우리에게 효과가있는 솔루션은 명시 적으로 GenerationType.SEQUENCE을 사용합니다.

-1

MySQL과 PostgreSQL 사이에는 SQL 표준 준수가 있습니다. PostgreSQL Postgres는 SQL92/99의 좋은 하위 집합과 이러한 하위 집합에 대한 개체 지향 기능을 잘 알고 있습니다. Postgres는 선언적 SQL 쿼리, 하위 쿼리, 뷰, 다중 사용자 지원, 트랜잭션, 쿼리 최적화, 상속 및 배열과 같은 복잡한 루틴 및 규칙을 처리 할 수 ​​있습니다. 다른 데이터베이스에서 데이터 선택을 지원하지 않습니다.

MySQL은 SQL92를 기초로 사용합니다. 무수한 플랫폼에서 실행됩니다. MySQL은 다른 데이터베이스의 테이블을 조인 할 수있는 쿼리를 생성 할 수 있습니다. ANSI 및 ODBC 구문을 사용하여 왼쪽 및 오른쪽 외부 조인을 모두 지원합니다. MySQL 4.1 버전부터 MySQL은 서브 쿼리를 처리 할 것입니다. 출시 5 일부터 지원되는 조회수입니다.

자세한 내용은을 참조하십시오. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html

+0

제발 생각하지 마세요.하지만 MySQL과 PostgreSQL 비교 (Hibernate의 기본값이 다르더라도) 주제와 관련이 없다. – mrts

2

zoidbeck의 답변에 동의합니다. 당신이 전략을 변경해야 : 새 테이블을 만들 필요가,

@GeneratedValue(strategy = GenerationType.TABLE) 

하지만 그건 모두가 아니다, 초록의 테이블에 기본 키 순서를 개최한다 무엇.

@Id 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ConfirmationCodeGenerator") 
@TableGenerator(table = "SEQUENCES", name = "ConfirmationCodeGenerator") 
public long getConfirmationCode() { 
    return confirmationCode; 
} 

에 매핑을 수정하고 데이터베이스에 새 테이블은 다음과 같이한다 : 응용 프로그램을 실행 enter image description here

, Hibernate는이에 sequence_name 엔티티 이름이됩니다 행 (SuperClass를 삽입합니다 예) 및 sequence_next_hi_value 값은 자동으로 증가되고 모든 구현 서브 클래스의 테이블에 대한 새 레코드에 사용됩니다.

0

상속을 위해 @MappedSuperclass를 사용할 수 있습니다.

+0

답변에 대한 예제 코드를 추가 할 수 있습니까? –