2013-02-17 4 views
0

좋아, 내가 정말로 이것을 원한다면 100 % 확신하지는 못했지만, 현재는 좋은 생각 인 것 같다.Hibernate와 PostgreSQL : GenerationType.IDENTITY를 설정할 수 있습니까? 각 id 열의 기본값은 공유 시퀀스에서 가져옵니다.

나는이처럼 내 개체를 구성 : 나는 Hibernate가 테이블을 생성 할 경우

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

, 결과는 다음과 같습니다 차례로

id bigserial NOT NULL, 
    CONSTRAINT test_pkey PRIMARY KEY (id) 

BIGSERIAL은 기본값으로 BIGINT로 변환 :

nextval('test_id_seq'::regclass) 

이제는 괜찮 았지만 현재는 하나의 시퀀스를 사용하려고합니다. 모든 테이블과 기본 값을 원하는가되게합니다 :

nextval('my_global_sequence'::regclass) 

내가이 자동으로 같은 테이블을 정의하는 최대 절전 모드로 말할 수있는 방법 어쩌면 내가 갈 수 있고 나중에 수동으로 디폴트 값을 조정,하지만 당신은 어떤 아이디어가 있습니까? ID 열에 대해이 같은 코드 (테스트되지 않은 SQL 구문)를 발행 것이라고 내 자신의 생성 테이블 SQL 전략을 추진하는 방법 어쩌면 거기 : 나는 IDENTITY 전략을 고수하려는

id bigint NOT NULL DEFAULT = nextval('my_global_sequence'::regclass) 

주, 나 때문에 "hi/lo 곱하기 할당 크기 캐시 시퀀스"가 발생하지 않도록하고 싶습니다. 때때로 pgAdmin을 통해 수동 행을 삽입하여 최대 절전 모드와 ID 충돌을 일으키지 않아도됩니다. 다른 모든 전략은 나에게 마술처럼 보입니다. (= 나는 그것들을 이해하지 못합니다.)

당신이 사용하고자하는 시퀀스 생성기 확인하려면 ID에 주석을 사용할 수 있습니다

답변

-1

:

를 코드를 사용하여 예제로 : 특정 순서를 구성하는 간단이 주석으로

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@SequenceGenerator(name="my_global_sequence") 
private long id = 0; 

을 각 엔티티 또는 엔티티 그룹에 대한 생성기를 사용하거나 모든 곳에서 동일하게 사용할 수도 있습니다.

주의해야

은 내가 최대 절전 모드와 함께이 작업을 수행하는 방법을 알아낼하지 않았다

+1

나는 이것을 테스트했지만 나에게 적합하지 않습니다. id 컬럼은 bigserial로 정의되고, 시퀀스 이름 'test_id_seq'가 생성됩니다. 나에게 GenerationType.IDENTITY가 @SequenceGenerator 어노테이션보다 우선하는 것처럼 보입니다. – Zalumon

0

이 모든 개체에 대한 그 주석을 정의해야한다는 것입니다. 내 현재 솔루션은 매번 시작할 때마다 실행되는 단순한 오래된 JDBC/SQL 로직입니다. 지금까지 나는 그것에 대해 꽤 행복하다.

Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword); 

String catalog = connection.getCatalog(); 
String schema = "public"; 

DatabaseMetaData databaseMetaData = connection.getMetaData(); 

ResultSet tablesResultSet = databaseMetaData.getTables(catalog, schema, null, new String[] { "TABLE" }); 

while(tablesResultSet.next()) 
{ 
    String tableName = tablesResultSet.getString("TABLE_NAME"); 

    LOGGER.info("updating table: '" + tableName + "', setting global sequence"); 

    // update primary keys to global sequence 
    { 
    //  LOGGER.info("setting global sequence for '" + tableName + "'.id"); 

    connection.createStatement().execute("ALTER TABLE \"" + tableName + "\" ALTER COLUMN id TYPE bigint;"); 
    connection.createStatement().execute("ALTER TABLE \"" + tableName + "\" ALTER COLUMN id SET NOT NULL;"); 
    connection.createStatement().execute("ALTER TABLE \"" + tableName + "\" ALTER COLUMN id SET DEFAULT nextval('my_global_sequence'::regclass)"); 
    } 
}