2016-05-13 92 views
0

我目前面臨一個讓我發瘋的問題。自定義標識生成器

我想創建自己的IdentifierGenerator來管理特定格式的ID。

public class CustomGenerator implements IdentifierGenerator { 

    private static final String REQUEST = "SELECT CURRVAL('sequence')"; 

    private final String prefixFormat = "PREFIX-%s"; 

    @Override 
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException { 
     final String prefix = getPrefix(); 
     Session sessionHibernate = (Session) session; 
     Query query = sessionHibernate.createSQLQuery(REQUEST); 
     Object obj = query.uniqueResult(); 
     return null; 
    } 

    private String getPrefix() { 
     final Calendar date = Calendar.getInstance(); 
     DateFormat dateFormat = new SimpleDateFormat("yyyyMM"); 
     return String.format(prefixFormat, dateFormat.format(date.getTime())); 
    } 

} 

我的JUnit測試:

@Test 
@Transactional 
public void addEntity() { 
    final Entity entity= new Entity(); 
    final long count = this.entityRepository.count(); 

    this.entityRepository.saveAndFlush(rex); 

    assertEquals(count + 1, this.entityRepository.count()); 
} 

我的實體:

@Entity 
@Table(name = "ENTITY") 
public class Entity { 

    @Id 
    @GenericGenerator(name = "sequence", strategy = "[...]CustomGenerator") 
    @GeneratedValue(generator = "sequence") 
    @Column(name = "ENTITY_ID") 
    private Integer entityId; 

    [...] 
} 

我的JUnit測試崩潰 - 堆棧跟蹤:

org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [SELECT CURRVAL('sequence_rex_id')]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:238) 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:221) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417) 
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) 
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) 

數據庫:HSQLDB(測試)和PostgreSQL (製作)

有沒有人有任何想法?

對不起,我可以做出任何錯誤。英語不是我的母語。

+0

我把測試從HSQLDB移到POSTGRESQL,問題就消失了。 我想這個問題來自HSQLDB(2.3.2)的配置。 –

回答

0

SELECT CURRVAL('sequence')語法特定於PostgreSQL。在HSQLDB中使用PostgreSQL語法時,應該在JDBC連接URL中包含必需的SQL語法標誌。例如jdbc:hsqldb:mem:test;sql.syntax_pgs=true

+0

它沒有解決問題,我仍然有同樣的錯誤! –