2016-05-13 91 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

它没有解决问题,我仍然有同样的错误! –