java.lang.ArrayIndexOutOfBoundsException: 0 dans hibernate.dialect.lock.SelectLockingStrategy
Bonjour,
Je migre actuellement une appli de JBoss 4.2.3 à JBoss 7.1.3.
Je rencontre une difficulté concernant Hibernate.
C'est une appli JSF (au départ JSF 1.2 adaptée JSF2) + Richfaces 3.3.3 + Hibernate 3 (en fait basée sur Seam 2.0.2)
J'ai mis un Hibernate 3.6.6 en module sur le serveur (le 4 présent ne convient pas).
J'essaye de déployer en faisant à chaque 1ère erreur les corrections nécessaires.
Une des dernières erreurs était dûe à Hibernate:
"Unable to instantiate default tuplizer ... component class not found: int"
J'ai changé les types de base int en Integer ce qui a supprimé le message. Je ne sais pas si j'ai bien fait. En tout cas ça a supprimé cette erreur.
Maintenant j'ai une nouvelle erreur Hibernate sur laquelle je sèche (trace JBoss):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 08:56:51,761 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 52) MSC00001:
Failed to start service jboss.persistenceunit."Appli.ear/Appli.jar#sys-pu":
org.jboss.msc.service.StartException in service jboss.persistenceunit."Appli.ear/Appli.jar#sys-pu":
java.lang.ArrayIndexOutOfBoundsException: 0
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:100)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [rt.jar:1.7.0_11]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [rt.jar:1.7.0_11]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_11]
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at org.hibernate.dialect.lock.SelectLockingStrategy.generateLockString(SelectLockingStrategy.java:122)
at org.hibernate.dialect.lock.AbstractSelectLockingStrategy.<init>(AbstractSelectLockingStrategy.java:44)
at org.hibernate.dialect.lock.SelectLockingStrategy.<init>(SelectLockingStrategy.java:62)
at org.hibernate.dialect.Dialect.getLockingStrategy(Dialect.java:930)
at org.hibernate.persister.entity.AbstractEntityPersister.generateLocker(AbstractEntityPersister.java:1419)
at org.hibernate.persister.entity.AbstractEntityPersister.initLockers(AbstractEntityPersister.java:1407)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:435)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:286)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:197)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.access$500(PersistenceUnitServiceImpl.java:57)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:96)
... 4 more |
J'ai pensé à une property manquante dans persistence.xml, mais je n'arrive pas à mettre le doigt dessus. Ou c'est peut-être tout autre chose ?
avant l'erreur il me met cette info qui doit être en rapport:
Code:
11:03:52,950 INFO [org.hibernate.tuple.PojoInstantiator] (ServerService Thread Pool -- 51) no default (no-argument) constructor for class: java.lang.Integer (class must be instantiated by Interceptor)
La trace de démarrage grossit mais je n'arrive pas au bout: "ERROR [org.jboss.as] (Controller Boot Thread) JBAS015875: JBoss AS 7.1.3.Final "Arges" a démarré (avec des erreurs) en 13488ms - 1434 sur 1676 services ont démarré (151 services ont échoué ou manquent de dépendances, 90 services sont passifs ou à la demande)
"
Toute suggestion est la bienvenue.
Marche pô. Je vais faire autrement
Bon, ça ne fonctionne toujours pas et je ne trouve pas de réponse pertinente sur les forums: je vais faire autrement.
Je mets donc résolu, mais en fait le problème lui-même n'a pas de réponse ici. Simplement je reprends tout ça différemment. ;)
Problème Hibernate résolu
Bon, j'ai trouvé la solution à mon problème ; je la note pour ceux qui auraient la même difficulté.
Dans mon appli des entity ont pour clé primaire un id.
D'autres entity ont des classes comme clés primaires composées au lieu d'avoir un id comme les autres.
En JEE5 on a pour des clés composées plusieurs annotations @EmbeddedId sur différents membres de la classe.
En JEE6 c'est différent, il n'y a plus qu'un seul @EmbeddedId sur la classe qui sert de primary key, et donc cette classe *PK est membre de l'entity.
Donc grossomodo de JEE5 à JEE6 on a déporté les membres de l'entity servant à la création de l'id vers l'id lui-même, ce qui est une bonne chose, c'est plus clair.
Les 2 classes sont donc anotées.
L'entity ressemble à ça:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| @Entity
MonEntity {
@EmbeddedId
private MonEntityPK monEntityPK;
private Data3 data3;
public MonEntityPK getMonEntityPK(){
return monEntityPK;
}
public void setMonEntityPK(MonEntityPK monEntityPK){
this.monEntityPK = monEntityPK;
}
MonEntity(){
}
MonEntity(MonEntityPK monEntityPK){
this.monEntityPK = monEntityPK;
}
MonEntity(Data1 data1, Data2 data2, Data3 data3){
this.monEntityPK = new MonEntityPK(data1, data2);
this.data3 = data3;
}
...
} |
la clé ressemble à ça
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| @Embeddable
MonEntityPK {
private Data1 data1;
private Data2 data2;
public MonEntityPK(){
}
public MonEntityPK(Data1 data1, Data2 data2){
this.data1 = data1;
this.data2 = data2;
}
public int hashCode() {
...
}
public boolean equals(Object that) {
...
}
} |
L'erreur qui s'affichait
Code:
1 2 3
| java.lang.ArrayIndexOutOfBoundsException: 0
...
SelectLockingStrategy.generateLockString(...) |
n'était pas super explicite sur le problème réel.
Comme ça maintenant en Hibernate 4.1.6 ça fontionne :D