2013-01-15 90 views
7

我们正在升级,从3.6版本到冬眠4.1.9的模式,我面临着一个错误休眠4 - 的getGeneratedKeys()支持未启用

[#| 2013-01-14T18:33 :46.519 + 0530 | INFO | glassfish3.1.1 | javax.enterprise.system.std.com.sun.enterprise.server.logging | _ThreadID = 122; _ThreadName = Thread-3; | 2013-01-14 18:33:46,518 [http-thread-pool-8080(5)]错误envId {} - sesId {} - com.spmsoftware.webframework.exception.ExceptionHandlerUtil [31] - 未处理的异常! org.hibernate.AssertionFailure:getGeneratedKeys()支持未启用 at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.checkAutoGeneratedKeysSupportEnabled(StatementPreparerImpl.java:93)〜[hibernate-core-4.1.9.Final.jar: 4.1.9.Final] at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:112)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.id.SequenceIdentityGenerator $ Delegate.prepare(SequenceIdentityGenerator.java:106)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.id.insert.AbstractReturningDelegate。 performInsert(AbstractReturningDelegate.java:55)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2936)〜[ hiber nate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3447)〜[hibernate-core-4.1.9.Final。 jar:4.1.9.Final] at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.engine.spi.ActionQueue。 addResolvedEntityInsertAction(ActionQueue.java:203)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)〜[ hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)〜[hibernate-core- 4.1.9.Final.jar:4.1.9.Final] at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320)〜[hibernate-core-4.1.9.Final.jar:4.1。 9.Final] at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate。 event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener。 java:126)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)〜[hibernate-entitymanager- 4.1.9.Final.jar:4.1.9.Final] at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.event.internal。 DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) 〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)〜[hibernate-core-4.1.9.Final。 jar:4.1.9.Final] at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:818)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org。 hibernate.internal.SessionImpl.persist(SessionImpl.java:822)〜[hibernate-core-4.1.9.Final.jar:4.1.9.Final] at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:865)〜[hibernate-entitymanager-4.1.9.Final.jar:4.1.9。最后]

当我试图坚持其定义如下

@Entity 
@Table(name = "ACCESS") 
@GenericGenerator(name = "auth-generator", 
    strategy = "sequence-identity", 
    parameters = @org.hibernate.annotations.Parameter(name = "sequence", value = "ACCESS_SEQ")) 
public class Access implements Identifiable { 
    private Long id; 

    @Id 
    @GeneratedValue(generator = "auth-generator") 
    @Column(name = "ROW_IDENTIFIER", nullable = false) 
    public Long getId() { 
     return id; 
    } 
} 

在比较休眠源代码3.6我看到了一个休眠实体此错误看出,同时创造SequenceIdentityGenerator休眠一份准备好的声明不检查“hibernate.jdbc.use_get_generated_keys”(AbstractBatcher - 506)和版本4.1.9(StatementPreparerImpl - 112)。

由于这样,我们的应用程序升级失败。想知道这个改变背后的原因是什么?

回答

11

我被困在同一个问题。终于找到了出路。把这行放在你的hibernate.cfg.xml文件中。

<property name="hibernate.jdbc.use_get_generated_keys">true</property> 

及其产生的参考和解释中可以找到:

http://www.jarvana.com/jarvana/view/hibernate/hibernate/3.0.2/hibernate-3.0.2-sources.jar!/org/hibernate/jdbc/AbstractBatcher.java?format=ok

+0

这确实是解决方案。谢谢! – Withheld

+2

为春季启动应用程序,这可以''spring.jpa.properties.hibernate.jdbc.use_get_generated_keys:true'设置属性文件 – Deepu

+0

为Grails应用程序 - 在DataSource.groovy 'hibernate.jdbc.use_get_generated_keys = true' – argoden