2014-11-14 2 views
1

최대 절전 모드와 Postgres에 문제가 있습니다. 모든 것이 제대로 작동하는지 테스트하기 위해 코드 블록을 반복합니다. 그러나이 코드 블록에는 두 개의 사용자 계정을 useraccount 테이블에 유지하기위한 반복적 인 지속성 메소드가 포함되어 있습니다. 그것은 처음 제대로 작동합니다. 그러나 이후에 코드를 실행하면 UserAccount 개체 ID가 증가하고 테이블의 해당 사용자는 원래 값을 유지합니다. 나는 발전기 클래스로 nativeidentity을 사용하려고 시도했다. 은 0에 ID를 유지하고 native은 위에서 설명한 것과 동일한 문제를 가지고있다.Hibernate와 PostgreSQL 자동 증가가 동기화되지 않습니다.

이 코드는 비현실적인 환경 (동일한 코드 블록을 통해 반복)을 실현하지만 필연적으로이 기능을 수행하지는 않습니다. 실제로 모든 테이블에서 모든 항목을 제거한 후 사용자는 사용자 테이블에 제대로 추가됩니다. 그가 객체 ID가 테이블 ID와 동기화되는지 확인하는 방법이 있습니까?

다음은 useraccount ID에 대한 xml 매핑입니다. 포스트 그레스는 기본적으로 IDENTITY 열을 지원하지 않기 때문에 여기

<class name="UserAccount" table="useraccounts"> 
    <id name = "UserId" type="int" column="user_id" unsaved-value="null"> 
     <generator class="increment"/> 
    </id> 

그리고는, 최대 절전 모드 설정 파일

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration SYSTEM 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.dialect"> 
     org.hibernate.dialect.PostgreSQL82Dialect 
    </property> 
    <property name="hibernate.connection.driver_class"> 
     org.postgresql.Driver 
    </property> 
    <property name="hibernate.connection.url"> 
     jdbc:postgresql://localhost:5432/agora-db 
    </property> 
    <property name="hibernate.connection.username"> 
     postgres 
    </property> 
    <property name="hibernate.connection.password"> 
     postgres 
    </property> 
    <property name="connection_pool_size">1</property> 
    <property name="hbm2ddl.auto">create</property> 
    <property name="show_sql">true</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <mapping resource="hibernate.hbm.xml"/> 

</session-factory> 
</hibernate-configuration> 
+0

참고 :이 genearaaly 애플리케이션 로그인에 대한 포스트 그레스 수퍼 유저를 사용하는 것은 좋지 않습니다. 그 대신 특수한 역할을하는 것이 좋습니다. – joop

+0

의미가 있습니다. 나는 이것을 디버그 목적으로 만 사용하고있다. 감사! – dboshardy

답변

2

당신은 sequence identifier 발전기를 사용해야합니다. IDENTITY 열을 에뮬레이션하는 SERIAL 열을 뒷부분에 시퀀스를 사용하여 지원합니다. Postgres는 IDENTITY보다 훨씬 효율적인 시퀀스를 지원합니다.

그래서 ID 정의는 다음과 같아야합니다

<id name="UserId" column="user_id"> 
    <generator class="sequence"> 
     <param name="sequence">USER_ID_SEQUENCE</param> 
    </generator> 
</id> 
+0

JPA에서 ID 전략을 사용하는 경우 postgres 시퀀스가 ​​사용됩니다 ... –

+0

정확히 동일한 것은 아닌 PostgreSQL [SERIAL 열] (http://stackoverflow.com/questions/787722/postgresql-autoincrement) 유형을 사용한다고 생각합니다. 정규 시퀀스를 사용합니다. 시퀀스를 사용하여 항상 재설정하거나 생성 된 값 캐싱 옵션을 지정할 수 있습니다. –

관련 문제