Bonjour,

Je suis sur un projet où la couche de persistence utilisée est en "Hibernate pure", à savoir un dataSource, une sessionFactory (org.springframework.orm.hibernate3.LocalSessionFactoryBean) avec comme mappingResources un ensemble d'entitées définies avec des fichiers hbm.xml.

Pour faire accepter une migration vers une solution JPA, il faut que je fasse un petit exemple d'utilisation de JPA avec des entitées déjà existantes (on ne peut pas se permettre de tout changer d'un coup). Pour ce faire j'ai modifié le fichier persistence.xml pour y introduire un EntityManagerFactory et un TransactionManager ainsi que la persistence unit comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <class>com.blablabla.entity.EntityA</class>
    </persistence-unit>
J'ai aussi modifier EntityA pour la rendre "JPA" compatible (@Id, @Column, etc.). La deux stack de persistence partage la même data source.

Mon transactionManager me persiste/supprime bien mes entités (EntityA) cependant lorsque l'on a des foreign key entre une entité managée par JPa et une entité managée par du hibernate brute, là rien ne va plus.

Example:
soit EntityA une entité JPA et EntityB une entité au format hibernate hbm, avec une relation de type OneToOne (EntityA a EntityB.id comme clé étrangère)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
EntityB newEntityB = new EntityB(...);
newEntityB = entityBDao.add(newEntityB); // Géré par une impl d'ORM qui utilise la sessionFactory
EntityA newEntityA = new EntityA(newEntityB.id, ...);
newEntityA = entityADao.add(newEntityA); // Géré par le bean transactionManager de JPA
Apres ce code là, si l'on souhaite appeler le DAO de l'entité A pour faire par exemple un entityADao.loadByEntityBId qui nous retroune une entité A, on a une incohérence entre les caches (2ème niveau je pense?) des deux modèles: l'entité B n'est pas encore persistée et donc le dao de A nous retourne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
(entityB_id)=(XX) is not present in table "EntitiesB"
Des idées pour faire utiliser le même cache et pour gérer des entitées purement hibernate depuis JPA et vise-versa?

Merci d'avance à ceux qui auront la patience de lire ce post en entier