<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.