-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: ID Generator bug in JPA implementation ??
PostPosted: Tue Feb 13, 2007 3:34 am 
Newbie

Joined: Mon Dec 11, 2006 10:28 am
Posts: 7
Ich benutze die aktuelle Version von Hibernate (3.2.1 GA) mit der selben Version von Annotations und EntityManager. Ich habe das folgende Problem: (leider keine Antwort im Englischen Forum, vielleicht gibts hier jemanden, der bestätigen kann, dass es sich um einen Bug handelt)

Ich verwende JPA und habe folgende SQL Definition:

Code:
/*==============================================================*/
/* Table: CmdQueueIn                                            */
/*==============================================================*/
create table MTRACKER.CmdQueueIn
(
    CmdQueueInId         bigint                         not null global autoincrement,
    Type                 int,
    Cmd                  varchar(2048),
    CmdState             int,
    MLUser               bigint                         not null,
    ExecutionTime        timestamp,
    FinishTime           timestamp,
    ExecutionServer      varchar(64),
    ScheduleString       varchar(64),
    RetryCount           int,
    ResultMessage        varchar(256),
    RecordState          int                            not null default 1,
    CDate                timestamp                      not null default current timestamp,
    MDate                timestamp                      not null default current timestamp,
    constraint PK_CMDQUEUEIN primary key (CmdQueueInId)
);


Die gemappte Java Klasse hat für den Primary Key CmdQueueInId die folgende Annotation:

Code:
    .......
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "CmdQueueInId", nullable = false)
    private BigInteger cmdQueueInId;
    .....


Ich erhalte die folgende Exception:

Quote:
avax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:629)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:218)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:176)
at $Proxy16.persist(Unknown Source)
at com.trixpert.dao.CmdQueueInDAO.save(CmdQueueInDAO.java:46)
at com.trixpert.test.dao.CmdQueueInDAOTest.testCreateNewCmd(CmdQueueInDAOTest.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at
......
Caused by: org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string
at org.hibernate.id.IdentifierGeneratorFactory.get(IdentifierGeneratorFactory.java:59)
at org.hibernate.id.IdentifierGeneratorFactory.getGeneratedIdentity(IdentifierGeneratorFactory.java:35)
at org.hibernate.id.IdentityGenerator$BasicDelegate.getResult(IdentityGenerator.java:157)
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2108)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2588)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:180)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:212)
... 34 more


Ich verwende eine SYBASE Adaptive Server Anywhere Datenbank. "global autoincrement" im SQL Code zum Primary Key Feld bedeutet, dass der DB Server automatisch bei einem Insert einen neuen Primary Key Wert erzeugt. JPA bietet dafür Unterstützung durch die Annotation @GeneratedValue(strategy=GenerationType.IDENTITY).

Das Problem ist nun das Mapping des SQL Datentyps BIGINT auf einen Java Datentyp. Für den Fall, dass der BIGINT UNSIGNED ist, reicht der Platz eines java.lang.long nicht aus! Aus diesem Grund wurde in der JPA Spezifikation dafür ein java.math.BigInteger definiert.

Wenn man nun den Stack-Trace anschaut, sieht es so aus, also ob Hibernate diesen Datentyp in der IdentifierGeneratorFactory nicht unterstützt:

Quote:
Caused by: org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string
at org.hibernate.id.IdentifierGeneratorFactory.get(IdentifierGeneratorFactory.java:59)


Hat jemand schon ein ähnliches Verhalten gehabt und kann das Problem bestätigen???

Besten Dank für Eure Mithilfe.

Thomas Bednarz


Top
 Profile  
 
 Post subject:
PostPosted: Tue Feb 13, 2007 11:19 am 
Newbie

Joined: Tue Feb 13, 2007 10:27 am
Posts: 4
In ein ähnliches Problem bin ich auch gelaufen, nur mit dem TableGenerator und Number als Datentyp für die Id.
Beim genaueren Lesen der Spec sind wir dann im Abschntt 2.1.4 auf folgenden Satz gestossen: "If generated primary keys are used, only integral types will be portable." Integrale Datentypen sind laut Java Spec nur byte, short, int, long und char. Von daher geht die Hibernate Implementierung IMHO mit der JPA Spec konform.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Feb 13, 2007 12:47 pm 
Newbie

Joined: Mon Dec 11, 2006 10:28 am
Posts: 7
Hmm..., da gefällt mir die TopLink Implementation aber besser.

BIGINT ist nun mal ein Datentyp, der auf diversen DB Servern unterstützt wird. Wir verwenden diesen Typ für alle unsere PK Felder. Ich finde zwar BigInteger in höchstem Masse ineffizient, aber ein Datenverlust aufgrund eines zu kleinen Speicherraums in java.lang.long ist noch schlimmer.

Wenn das mapping mit Hibernate nicht funktioniert, ist das für mich leider unbrauchbar. Ich werde das Thema aber bei SUN mal plazieren.

Thomas


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.