-->
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.  [ 2 posts ] 
Author Message
 Post subject: @CollectionofElements (Map<String,Object) not lazy
PostPosted: Thu Mar 18, 2010 10:01 am 
Newbie

Joined: Thu Mar 18, 2010 9:15 am
Posts: 2
Hi,
thank in advance for your attention ^^
I have this mapped superclass, DataImpl

Code:
@MappedSuperclass
@Proxy(lazy=true) //useless
public abstract class DataImpl extends WebsiteModelAbstractIdentifiable implements Data {

   private Map<String,Object> key2data;

   public DataImpl() {
      init();
   }
   
        ...

   @CollectionOfElements(targetElement=ByteArrayBlobType.class)
   @Cascade(value = {CascadeType.ALL,CascadeType.DELETE_ORPHAN})
   @JoinTable(
      name="data",
      joinColumns = @JoinColumn(name="entityid")
   )
   @MapKey(
      columns = {@Column(name="keytodata")}
   )
   @Column(name="data")
   @LazyCollection(LazyCollectionOption.TRUE)
   @Fetch(FetchMode.SUBSELECT)
   private Map<String, Byte[]> getSerializedMap(){
      Map <String, Byte[]> result = new HashMap<String, Byte[]>();
      if(key2data != null ) {
         for( String key : key2data.keySet()){
            result.put(key, HibernateUtils.objectToByte( key2data.get(key) ));
         }
      }
      return result;
   }

   private void setSerializedMap(Map<String,Byte[]> serializedMap){
      this.key2data = new HashMap<String, Object>(serializedMap.size());
      for( String key : serializedMap.keySet()){   
         key2data.put(key, HibernateUtils.byteToObject( serializedMap.get(key) ));
      }
   }
   ...
}


As you can see, I have mapped a Map<String,Object> into a Map<String,Byte[]>. In this way I can store some usefull Java Object into the db ( in table data with a INT entityId, String keytodata, BLOB data ).
Every class of my application extend DataImpl and everything works fine.
My only problem is the lazyness of the CollectionOfElements.

I have two class who extends DataImpl, PageClassImpl and PageImpl

PAGECLASSIMPL
Code:
@Entity
@Table(name="pageclass")
@Proxy(lazy=true)
public class PageClassImpl extends DataImpl implements PageClass, Identifiable {

   private Set<Page> pages;
        ....

   protected  PageClassImpl() {
      init();
   }
        ....

   @OneToMany(targetEntity=PageImpl.class)
   @JoinTable(
      name="pageclasspage",
      joinColumns=@JoinColumn(name="pageclass"),
      inverseJoinColumns=@JoinColumn(name="page")
   )
   @LazyCollection(LazyCollectionOption.TRUE)
   @Fetch(FetchMode.SELECT)
   private Set<Page> getPages() {
      return pages;
   }
   ....
}


PAGEIMPL
Code:
@Entity
@Table(name="page")
@Proxy(lazy=true)
public class PageImpl extends DataImpl implements Page, Data {

   protected URI pageUri;
   
   protected Set<RequestCollection> requestCollectionSet;

   protected PageImpl(){};
   
   //MGC
   public PageImpl(int id, URI uri, Set<RequestCollection> rc) {
      super(id);
      init(uri, rc);
   }

   ...
}


In few word i have a crawler. everytime i found a new htmlpage, I save the html content in this way
page.setData("htmlpage", HTMLCONTENT);
When I save the page with session.save(page) this is the correct result

Code:
...
Hibernate: insert into page (uri, id) values (?, ?)
Hibernate: insert into data (entityid, keytodata, data) values (?, ?, ?)
...


Every page belongs to one pageclass. So when I ask to hibernate to retrieve the pageclass pages with pageclass.getPages() this is the result

Code:
Hibernate: select pages0_.pageclass as pageclass1_, pages0_.page as page1_, pageimpl1_.id as id2_0_, pageimpl1_.uri as uri2_0_ from pageclasspage pages0_ left outer join page pageimpl1_ on pages0_.page=pageimpl1_.id where pages0_.pageclass=?
Hibernate: select serialized0_.entityid as entityid0_, serialized0_.data as data0_, serialized0_.keytodata as keytodata0_ from data serialized0_ where serialized0_.entityid=?
Hibernate: select serialized0_.entityid as entityid0_, serialized0_.data as data0_, serialized0_.keytodata as keytodata0_ from data serialized0_ where serialized0_.entityid=?
Hibernate: select serialized0_.entityid as entityid0_, serialized0_.data as data0_, serialized0_.keytodata as keytodata0_ from data serialized0_ where serialized0_.entityid=?
Hibernate: select serialized0_.entityid as entityid0_, serialized0_.data as data0_, serialized0_.keytodata as keytodata0_ from data serialized0_ where serialized0_.entityid=?
Hibernate: select serialized0_.entityid as entityid0_, serialized0_.data as data0_, serialized0_.keytodata as keytodata0_ from data serialized0_ where serialized0_.entityid=?
Hibernate: select serialized0_.entityid as entityid0_, serialized0_.data as data0_, serialized0_.keytodata as keytodata0_ from data serialized0_ where serialized0_.entityid=?
...
for every  page i stored


As you can see, hibernate retrieve every page of the pageclass, but also the page htmlcontent that i've never asked. Something is wrong with the lazyness of the @CollectionofElements in DataImpl.


Top
 Profile  
 
 Post subject: Re: @CollectionofElements (Map<String,Object) not lazy
PostPosted: Thu Mar 18, 2010 2:49 pm 
Newbie

Joined: Thu Mar 18, 2010 9:15 am
Posts: 2
Solved.

instead of

@CollectionOfElements(targetElement=ByteArrayBlobType.class)

i need to write

@CollectionOfElements(targetElement=ByteArrayBlobType.class, fetch=FetchType.LAZY)


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