2011-11-15 2 views
3

복합 기본 키의 열 순서에 문제가 있습니다.JPA/Hibernate를 사용하여 복합 기본 키의 열 순서를 설정하는 방법

@Embeddable 
public class MessageInfo implements Serializable { 

    private byte loc; 
    private long epochtime; 

    @Column(name = "loc") 
    public byte getLoc() { 
     return loc; 
    }  

    @Column(name = "epochtime") 
    public long getEpochtime() { 
     return epochtime; 
    } 
} 

그것은이 매핑에 사용됩니다 :

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class AbstractMessage implements Message { 

    private MessageInfo info; 
    private int blah; 

    @EmbeddedId 
    public MessageInfo getInfo() { 
     return info; 
    } 
} 

나는 구체적인 @Table 클래스 최대 절전 모드로 경우 AbstractMessage를 서브 할 때 오류없이 데이터베이스와 테이블을 생성 나는 다음을 포함하는 테이블이 있습니다. 문제는 최대 절전 모드가 내가 원했던 것의 역순으로 열이있는 복합 기본 키를 생성한다는 것입니다.

CREATE TABLE `mydb`.`concrete_table` (
    `epochtime` bigint(20) NOT NULL, 
    `loc` tinyint(4) NOT NULL, 
    `blah` smallint(6) DEFAULT NULL, 
    `foo` smallint(6) DEFAULT NULL, 
    PRIMARY KEY (`epochtime`,`loc`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

나는 내가 10 LOC 년대의 최대있을 것이라는 점을 알고 있지만, 각 LOC 많은 대기원 시보 때문에 기본 키가

PRIMARY KEY (`loc`,`epochtime`) 

되고 싶어요.

어떤 도움을 주시면 감사하겠습니다 =)

답변

0

난 정말이 할 수있는 방법이라고 생각하지 않습니다. 내가 할 수있는 것은 SQL 작성 문을 사용하여 (올바른 순서로 변경) 작성한 다음 프로덕션 환경에서 수동으로 실행하는 것입니다.

테스트에서 Hibernate는 그 일을합니다.

+0

그래, 그게 지금 우리가하고있는 일이야. 나는 Hibernate가 디폴트를 변경하기위한 어떤 기능을 갖기를 희망했다. 응답 시간을내어 주셔서 감사합니다. – Garrett

6

방법이 있습니다. hibernate가 정의 된 객체 이름에 따라 기본 키에 대한 컬럼 세트를 정렬하는 방법을 알파벳 순서로 선택합니다.

예 : 이 같은 개체를 선언하는 경우 :

private byte loc; 
private long epochtime; 

지금 점점로 당신은 얻을 것이다 :

(`epochtime`,`loc`) 

을하지만 예를 들어 그들을 이름을 변경하는 경우 :

private byte aloc; 
private long epochtime; 

그것은 생성하는 것 그것은 다음과 같습니다 :

(`aloc`, `epochtime`) 

클러스터 된 인덱스를 특정 순서대로 사용하고자 할 때 알아 냈습니다. 나는 그것이 짜증나는 것이지만 그것이 내가 스키마를 수동으로 변경할 필요가 없도록 찾을 수있는 유일한 방법이라는 것을 알고있다.

+0

또 다른 경험이 있는데, 기본 키에서'date' 열이'company' 앞에옵니다. 비록 내가 Hibernate로 하여금 전체 데이터베이스 스키마를 다시 생성하게했다하더라도. – Glorfindel

관련 문제