3

TABLE_PER_CLASS 전략을 사용하여 상속을 만들려고하지만 각 테이블마다 다른 기본 키를 갖고 싶습니다.다른 기본 키를 사용하여 최대 절전 모드

나는 수백만 개의 인스턴스를 가진 하나의 클래스 레지스터를 가지며,이 인스턴스 중 일부는 "특별"하며 해당 열과 추가 열에 대해 다른 규칙을가집니다. 나는 하나의 고유 한 열을했습니다 때문에 id 속성을 필요가없는 기본 레지스터

@MappedSuperclass 

public abstract class Register { 


    @Id 
    @Column(nullable = false, unique = true, updatable = false) 
    private Long userId; 


    private Date checked; 

    @Column(nullable = false) 
    private RegisterState tipo; 
} 


@Entity 
@AttributeOverrides({ @AttributeOverride(name = "userId", column = @Column(nullable = false, unique = false, updatable = false)) }) 
public class PotencialRegister extends Register implements Serializable { 

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


    @Column(length = 64, nullable = false, unique = false) 
    private String referer; 
} 

하지만, 열이 고유하지 전문 기업에 대한 그래서 나는 여분의 속성을 추가했다.

create table PotencialRegister (
     id integer not null, 
     userId bigint not null, 
     checked datetime(6), 
     tipo integer not null, 
     referer varchar(64) not null, 
     primary key (id, userId) 
    ) 

    create table Register (
     userId bigint not null, 
     checked datetime(6), 
     tipo integer not null, 
     primary key (userId) 
    ) 

열 잘하며 schama 내가 원하는,하지만 내가 좋아하는 것 :

문제는 최대 절전 모드가 (생성 된 스키마가) 복합 기본 키 생성에 부모 ID를 사용하고 있다는 점이다 PotencialRegister 기본 키에서 "id"멤버를 제거합니다.

+0

아래의 답변에 제공된 문제가 계속 표시 되니? – Ravik

답변

6

@Id 열이없는 다른 클래스를 만들고이 클래스를 각 레지스터 유형의 기본 클래스로 사용할 수 있습니다.

@Entity 
@AttributeOverrides({ @AttributeOverride(name = "userId", column = @Column(nullable = false, unique = false, updatable = false)) }) 
public class PotencialRegister extends Register implements Serializable { 

    private Integer id; 


    @Column(length = 64, nullable = false, unique = false) 
    private String referer; 

    @Id 
    public Long getUserId(){ 
     return super.userId; 
    } 

    public void setUserId(Long uId){ 
     super.userId=uId; 
     } 

} 
: 다음

@Entity 
public class NormalRegister extends Register implements Serializable{ 

    @Id 
    public Long getUserId(){ 
     return super.userId; 
    } 

    public void setUserId(Long uId){ 
     super.userId=uId; 
     } 

    } 

당신은 귀하의 PotencialRegister 클래스를 정의하면 다음과 같은 작업을 수행 할 수 등록 정상적인 이제

@MappedSuperclass 

public abstract class Register { 

    @Column(nullable = false, unique = true, updatable = false) 
    private Long userId; 

    private Date checked; 

    @Column(nullable = false) 
    private RegisterState tipo; 
} 

:

은 그래서 당신의 등록 클래스는 같을 것이다

이걸로 기본 클래스에 ID가없고 모든 하위 클래스가 자신의 ID 속성을 정의 할 수 있습니다. te

+0

당신이 도움이되는 답변을 발견하면 친절하게 현상금 포인트를 공유하십시오. 더 이상의 설명이 필요하면 pls에게 물어보십시오. – Ravik

+0

실제로 "id"열을 갖고 싶지 않기 때문에 내 문제를 해결하지 못합니다. 완벽한 기본 키는 userId입니다. 추상 클래스에 넣어두면 문제가 생깁니다. 이륙 된 각 클래스에 불일치가 생깁니다. –

+0

PotenicalRegister 클래스에 문제가 있다는 것을 알고 있습니다. 여기에서 구현 ID 및 userId col은 추상 클래스에서 상속되므로 기본 키의 일부가됩니다. 내 솔루션을 사용하면 추상 클래스에 기본 키가 없기 때문에 원하는대로 기본 키를 정의 할 수 있으며 레지스터 클래스의 각 구현에는 pwn primay 키가있을 수 있습니다. – Ravik

1

표 클래스 계층 구조에서 Version 및 Id 속성은 모두 루트 클래스에서 상속 된 것으로 간주됩니다. 내가 잘못하지 않으면 단일 클래스/클래스 계층 구조에서 다중 ID 속성을 사용할 수 없습니다. 기본 클래스의 경우 테이블에 공통적 인 속성을 넣을 수 있고 개별 클래스를 나타내는 특정 클래스에서만 Id 특성을 사용할 수 있습니다.