-->
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.  [ 8 posts ] 
Author Message
 Post subject: Proxy et instrumentation
PostPosted: Thu May 28, 2009 6:12 am 
Newbie

Joined: Thu May 28, 2009 6:06 am
Posts: 4
Bonjour,

Il me semblait que l'instrumentation du code permettait de gérer le lazy loading des associations ToOne sans instancier des proxies.

Je tente toutes les combinaisons possibles, mais à chaque fois, hibernate génère un proxy.

Vous savez s'il est possible d'activer les lazy loading des relations ToOne sans créer de proxies grace à l'instrumentation du code ?

Merci !


Top
 Profile  
 
 Post subject: Re: Proxy et instrumentation
PostPosted: Thu May 28, 2009 6:13 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
hello
questions betes:
- as tu instrumenté tes classes via la tache Ant au moins?
- as tu utilisé no-proxy dans tes mappings?

@+
Anthony

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Proxy et instrumentation
PostPosted: Thu May 28, 2009 6:23 am 
Newbie

Joined: Thu May 28, 2009 6:06 am
Posts: 4
Il n'y a que des réponses bêtes !

1/ Le code est instrumenté via le plugin ant dans maven. J'ai vérifié dans les traces, ça marche impecable.
2/ il y a bien no-proxy dans le mapping.

Pour les courageux, voici un extrait du code de test très simple qui comporte 2 entités: A et B.
Le test crée un jeux de données et récupère le B référencé par A.

A+
Tibo

@Entity
public class EntiteA {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;

private String string;

@OneToOne(fetch=FetchType.LAZY)
@LazyToOne(LazyToOneOption.NO_PROXY)
private EntiteB oneToOne;

@OneToMany(mappedBy="oneToManyRev")
private List<EntiteB> oneToMany = new ArrayList<EntiteB>();
... get/set

@Entity
public class EntiteA {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;

private String string;

@OneToOne(fetch=FetchType.LAZY)
@LazyToOne(LazyToOneOption.NO_PROXY)
private EntiteB oneToOne;

@OneToMany(mappedBy="oneToManyRev")
private List<EntiteB> oneToMany = new ArrayList<EntiteB>();
... get/set

Jusque là, rien de bien sorcier.

Voila le code de test:

EntiteA a = creerDonneesDeTest();
EntiteB b;

session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

logger.info("session.get(EntiteA.class, a.getId())");
a = (EntiteA)session.get(EntiteA.class, a.getId());

if( a instanceof HibernateProxy )
logger.info("a est un proxy");
else
logger.info("a est une entite");

logger.info("a.getOneToOne()");
b = a.getOneToOne();

if( b instanceof HibernateProxy )
logger.info("b est un proxy");
else
logger.info("b est une entite");

logger.info("b.getString()");
b.getString();

logger.info("b.getOneToOneRev()");
a = b.getOneToOneRev();

if( a instanceof HibernateProxy )
logger.info("a est un proxy");
else
logger.info("a est une entite");

session.getTransaction().commit();
Et voila les traces:
28 mai 2009 12:19:32 test.test_hibernate.AppTest test1
INFO: session.get(EntiteA.class, a.getId())
Hibernate: select entitea0_.id as id0_0_, entitea0_.oneToOne_id as oneToOne3_0_0_, entitea0_.string as string0_0_ from EntiteA entitea0_ where entitea0_.id=?
Hibernate: select entiteb0_.id as id1_1_, entiteb0_.oneToManyRev_id as oneToMan3_1_1_, entiteb0_.oneToOneRev_id as oneToOne4_1_1_, entiteb0_.string as string1_1_, entitea1_.id as id0_0_, entitea1_.oneToOne_id as oneToOne3_0_0_, entitea1_.string as string0_0_ from EntiteB entiteb0_ left outer join EntiteA entitea1_ on entiteb0_.oneToManyRev_id=entitea1_.id where entiteb0_.id=?
28 mai 2009 12:19:32 test.test_hibernate.AppTest test1
INFO: a est une entite
28 mai 2009 12:19:32 test.test_hibernate.AppTest test1
INFO: a.getOneToOne()
28 mai 2009 12:19:32 test.test_hibernate.AppTest test1
INFO: b est un proxy
28 mai 2009 12:19:32 test.test_hibernate.AppTest test1
INFO: b.getString()
28 mai 2009 12:19:32 test.test_hibernate.AppTest test1
INFO: b.getOneToOneRev()
28 mai 2009 12:19:32 test.test_hibernate.AppTest test1
INFO: a est une entite
12:19:32,508 [main] INFO SessionFactoryImpl : closing
12:19:32,508 [main] INFO DriverManagerConnectionProvider : cleaning up connection pool: jdbc:mysql://localhost/test

On voit que b est un proxy alors que le code est instrumenté....


Top
 Profile  
 
 Post subject: Re: Proxy et instrumentation
PostPosted: Thu May 28, 2009 8:12 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
J'ai un doute par rapport au OneToOne, comme simple test pourrais tu switcher vers un ManyToOne?

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Proxy et instrumentation
PostPosted: Thu May 28, 2009 9:39 am 
Newbie

Joined: Thu May 28, 2009 6:06 am
Posts: 4
Visiblement, c'est identique.
Le NO_PROXY semble ignoré sur une association ManyToOne ou OneToOne avec un LAZY et un code instrumenté.

Anthony, normalement l'instrumentation doit-elle permettre de s'affranchir des proxies ?

A+
Tibo

Voici mon code modifié qui donne:
INFO: b est une entite
INFO: a est un proxy

logger.info("session.get(EntiteB.class, b.getId())");
b = (EntiteB)session.get(EntiteB.class, b.getId());

if( b instanceof HibernateProxy )
logger.info("b est un proxy");
else
logger.info("b est une entite");

logger.info("b.getManyToOne()");
a = b.getOneToManyRev();

if( a instanceof HibernateProxy )
logger.info("a est un proxy");
else
logger.info("a est une entite");


Top
 Profile  
 
 Post subject: Re: Proxy et instrumentation
PostPosted: Tue Jun 02, 2009 11:05 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
salut tibo,
oui effectivement c'est le but.
J'ai eu l'occasion de tester l'instrum plusieurs fois et ça marchait bien.
Je pencherait sur un pb de cycle de build, genre tu compiles, tu instrum et apres tu recompile ou tu n'utilises pas tes classes instrumentées.
Repars de zero, avec un tout petit testcase, sans maven.
Ou alors lance la testsuite instrum du la distro hibernate

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Proxy et instrumentation
PostPosted: Wed Jun 03, 2009 9:46 am 
Newbie

Joined: Thu May 28, 2009 6:06 am
Posts: 4
Anthony,

En effet, l'instrumentation ne se déclenchait pas ...
Ca marche impeccable pour les relations ManyToOne, mais donc pas du tout pour les OneToOne.

Merci de ton aide.
Thibault.


Top
 Profile  
 
 Post subject: Re: Proxy et instrumentation
PostPosted: Thu Jun 04, 2009 3:32 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
ça pourrait marcher pour les OneToOne mais uniquement si ceux ci sont constrained=true ou optional = false, je ne me souviens plus exactement.

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 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.