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를 생성하는 가장 쉽고 편리한 방법은 무엇입니까? 상속 전략을 변경하고 싶지 않습니다.
답변
여기서 문제는 “클래스 별 테이블”상속과 GenerationType.Auto
. MsSQL의 ID 열을 고려하십시오. 열 기반입니다. “클래스 별 테이블”전략에서는 클래스 당 하나의 테이블을 사용하고 각 테이블에는 ID가 있습니다.
시험:
@GeneratedValue(strategy = GenerationType.TABLE)
답변
PostgreSQL을 기본 데이터베이스로 사용하는 YouTube 자습서를 보면서 비디오 제작자가 기본 @GeneratedValue를 사용하여 성공적으로 앱을 실행하는 것을 보았 기 때문에 이것이 데이터베이스 방언 특정 문제인지 궁금합니다. 필자의 경우 (기본 데이터베이스는 MySQL 임) zoidbeck이 제안한대로 @GeneratedValue 전략을 GenerationType.TABLE로 수정해야했습니다.
동영상은 다음과 같습니다. https://www.youtube.com/watch?v=qIdM4KQOtH8
답변
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
값은 자동으로 증가하여 모든 구현 서브 클래스의 테이블의 새 레코드에 사용됩니다.
답변
우리의 경우에는 개발 및 프로덕션에 PostreSQL 데이터베이스를 사용하고 테스트에 메모리 내 hsqldb 데이터베이스를 사용합니다. 두 경우 모두 시퀀스를 사용하여 ID를 생성합니다. 분명히 postgres의 GenerationType.AUTO
기본값은 SEQUENCE
이지만 로컬 테스트에서는 실패했습니다 (hsqldb의 기본값은 다른 값이어야 함).
따라서 우리에게 효과가 있었던 솔루션은 명시 적으로 GenerationType.SEQUENCE
.
답변
상속을 위해 @MappedSuperclass를 사용할 수 있습니다.
답변
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