<union-subclass> (TABLE_PER_CLASS)와 함께 ID 열 키 생성을 사용할 수 없습니다.


95

com.something.SuperClass :

@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를 생성하는 가장 쉽고 편리한 방법은 무엇입니까? 상속 전략을 변경하고 싶지 않습니다.

답변:


229

여기서 문제는 "클래스 별 테이블"상속과 GenerationType.Auto . MsSQL의 ID 열을 고려하십시오. 열 기반입니다. "클래스 별 테이블"전략에서는 클래스 당 하나의 테이블을 사용하고 각 테이블에는 ID가 있습니다.

시험:

@GeneratedValue(strategy = GenerationType.TABLE)


2
완벽한 솔루션. Hibernate 포럼 조차도이
Spring Monkey

1
이 문제는 MySql에서만 발생하는지 아니면 클래스 별 테이블 접근 방식에 대한 비디오 중 하나를 볼 때 일반 문제입니까? postgres가 사용되었다는 점에서 잘 작동했습니다
Prashant

1
최근 Dropwizard 응용 프로그램을 테스트 할 때이 문제가 발생했습니다. 필자의 경우 세션 팩토리를 생성하기 위해 DW에서 사용하는 것과 동일한 구성 옵션을 사용하여 문제를 해결했습니다. "hibernate.id.new_generator_mappings"속성을 true로 설정하는 것이이 문제를 해결 한 것이라고 확신합니다. 이것은 DW 0.7.0, Hibernate 4.3.1, DB는 H2입니다.
sfitts

1
완벽하게 작동합니다. 그러나 'TABLE'ID 생성 전략은 많은 쿼리 (선택, 삽입 및 업데이트)를 트리거하고 기본 키에 대한 고유 값을 생성하기 위해 잠금을 유지하므로 선호하지 않는 것이 좋습니다. 그렇다면 큰 상속 시나리오가 있다면 이것에 대한 대안은 무엇일까요? 확실히 성능에 큰 영향을 미칠 것입니다.
MAC

8

PostgreSQL을 기본 데이터베이스로 사용하는 YouTube 자습서를 보면서 비디오 제작자가 기본 @GeneratedValue를 사용하여 성공적으로 앱을 실행하는 것을 보았 기 때문에 이것이 데이터베이스 방언 특정 문제인지 궁금합니다. 필자의 경우 (기본 데이터베이스는 MySQL 임) zoidbeck이 제안한대로 @GeneratedValue 전략을 GenerationType.TABLE로 수정해야했습니다.

동영상은 다음과 같습니다. https://www.youtube.com/watch?v=qIdM4KQOtH8


Postgres는 상속을 할 수 있으므로 이것이 데이터베이스에 특화되어 있다는 것이 맞을 수 있습니다. postgresql.org/docs/8.1/static/ddl-inherit.html 이 비디오는 스키마가 생성되는 방법을 설명하지 않습니다 (또는 놓쳤습니다). 따라서 NHibernate postgres 방언이 자체적으로이를 수행 할 수 있거나 대신 수동으로 'INHERITS'를 추가해야합니다. 사실 나는 말할 수 없다.
zoidbeck

6
PostgreSQL에서 Hibernate는 기본적으로 GenerationType.SEQUENCE. 그것이 자동으로 작동하는 이유입니다. PostgreSQL과 는 전혀 관련이 없습니다INHERITS .
Henning 2014

나는 시간 디버깅 많이 난이 게시물 볼 때까지 같은 자습서를 사용하여 & 내가 MySql.Spent을 사용하고 같은 @Generated이 문제를 일으키는 사용하고있다
디나 존

5

zoidbeck의 대답에 동의하십시오. 전략을 다음과 같이 변경해야합니다.

@GeneratedValue(strategy = GenerationType.TABLE)

하지만 그게 다가 아닙니다. 초록의 테이블 기본 키 시퀀스를 보유 할 새 테이블을 만들어야합니다. 매핑 수정

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

그리고 데이터베이스의 새 테이블은 다음과 같아야합니다. 여기에 이미지 설명 입력

애플리케이션을 실행할 때 Hibernate는 sequence_name엔티티 이름 ( SuperClass이 예제에서)이 될 행을 삽입 하고 sequence_next_hi_value값은 자동으로 증가하여 모든 구현 서브 클래스의 테이블의 새 레코드에 사용됩니다.


2

우리의 경우에는 개발 및 프로덕션에 PostreSQL 데이터베이스를 사용하고 테스트에 메모리 내 hsqldb 데이터베이스를 사용합니다. 두 경우 모두 시퀀스를 사용하여 ID를 생성합니다. 분명히 postgres의 GenerationType.AUTO기본값은 SEQUENCE이지만 로컬 테스트에서는 실패했습니다 (hsqldb의 기본값은 다른 값이어야 함).

따라서 우리에게 효과가 있었던 솔루션은 명시 적으로 GenerationType.SEQUENCE.


1

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


0

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

MySQL MySQL은 SQL92를 기반으로 사용합니다. 수많은 플랫폼에서 실행됩니다. Mysql은 다른 데이터베이스의 테이블을 조인 할 수있는 쿼리를 생성 할 수 있습니다. ANSI 및 ODBC 구문을 모두 사용하여 왼쪽 및 오른쪽 외부 조인을 모두 지원합니다. 해당 릴리스부터 MySQL 4.1부터 MySQL은 하위 쿼리를 처리합니다. 릴리스 5부터 지원되는보기입니다.

자세한 설명은 방문하십시오. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html


이것에 대해 나쁘게 생각하지 마십시오. 그러나 MySQL과 PostgreSQL 비교는 주제와 관련이 없다고 생각합니다 (Hibernate 기본값은 다르지만).
mrts
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.