Hi patrik,

thx. Could you let me informed about your changes, or at least your 
changed files. Because I'm working on a branch, these would ease merging 
your changes with my code.

For lazy initialization I think ???2one references shouldn't be lazy and 
so they can handled like hibernate components and not with 
populateAsociations.

My current try to improve the populate code ended with:

----
RichFaultBase.class:

     @SuppressWarnings("unchecked")
     public RichPerson getCaller() {
         if (caller == null) {
             if (populated == null) {
                 populated = 
associationLoader.populateAssociations(original);
             }

             if (populated.getCaller() != null) {

                 //caller = new RichPerson();
                 try {
                     caller = 
richPersonRepository.findById(populated.getCaller()
 
.getId());
                 } catch (PersonNotFoundException e) {
                     // TODO should throw an exception?
                     caller.fromModel(populated.getCaller());
                 }
             }

             //if (original != null && populated == null && 
associationLoader != null) {
             //    populated = 
associationLoader.populateAssociations(original);
             //
             //    if (populated.getCaller() != null) {
             //
             //    caller = new RichPerson();
             //    caller.fromModel(populated.getCaller());
             //    } else {
             //        caller = null;
             //    }
         }
         return caller;
     }
----

That problem here is, that if the caller is really null, the the 
populated.getCaller() is called each time I call this.getCaller(). But 
thats not really bad? If only ??2many-associations are lazy, here we got 
an empty collection on the first call, and all is fine.

I've delegated the creation of the new RichPerson-Object to the 
RichPersonRepository. Side effect is, all needed Repositories must be 
injected in the RichFault-class, wich is not very nice. I better 
solution seems to be to delegate the populateAssociations-logic, here 
"getCaller(original)" directly to the RichFaultRepository. This would 
separate all creation logic into the repositories.

To all repositories, I've added a findById:
----
  /**
      * @throws PersonNotFoundException
      */
     public RichPerson findById(Long id) throws PersonNotFoundException {
         Person foundPerson = 
personService.findById(createServiceContext(), id);
         RichPerson richPerson = null;
         // an exception is thrown, if no objects exists for this id
         //if (foundPerson != null) {
         richPerson = richPersonFactory.create();
         richPerson.fromModel(foundPerson);
         this.richPersons.put(foundPerson.getKey(), richPerson);

         //}
         return richPerson;
     }
----

What I've also done, is the to create src-gen/RichFaultBase and 
src/RichFault-(Impl) classes, like the pattern in the backend. This 
allows to implement some presentation logic in the Impl-class of each 
Enity. It seems to be very helpful.

And for the backend I've added an I?? e.g. IFault-interface, which 
contains all getter methods from the Entity classes. This allows to 
implement some sophisticated dynamic proxy magic to e.g. filter and 
search boxes without the need to concatenate the constants from e.g. 
FaultNames.

You are interested in code? If true, I would create an JIRA-entry for 
that and add a patch against my 1.5.0-branch vom beginning of december. 
Also for the "T save(T entity)"-methods in the backend service.

I'm using the RichGrudGuiObject, RichCrudGuiRepository and 
RichCrudGuiSpring as base for our RAP-frontend.

So now that I know you are working on the lazyloading stuff I will 
concentrate me on the entity filters.

Have a nice 2. christmas day.

Regards
    Steffen...

Patrik Nordwall schrieb:
> I am testing and bugfixing right now. This is one of the problems I have
> fixed. I will not be able to commit until the 5th. /patrik
> 
> Steffen Stundzig wrote:
>> Hi,
>>
>> I've deployed my backend application, based on 1.5.0-SNAPSHOT to my
>> jboss-4.2.2GA. I'm now starting my RCP frontend and try to load some data.
>>
>> My model contains e.g.:
>> Entity Fault {
>>     scaffold
>>     - @Person caller 
>> }
>> Entity Person {
>>     scaffold 
>>     String firstname nullable        
>>     - @Address address 
>> }
>> BasicType Address {
>>     String street nullable
>> }
>>
>> If I load a fault and call getCaller() on it, I got the following
>> exception:
>>
>> org.hibernate.LazyInitializationException: could not initialize proxy - no
>> Session
>>      at
>> org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
>>      at
>> org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
>>      at
>> org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:166)
>>      at
>> de.itemis.mitgas.stm.backend.person.domain.Person_$$_javassist_0.getAddress(Person_$$_javassist_0.java)
>>      at
>> de.itemis.mitgas.stm.backend.person.richclient.data.RichPersonBase.fromModel(RichPersonBase.java:305)
>>      at
>> de.itemis.mitgas.stm.backend.fault.richclient.data.RichFaultBase.getCaller(RichFaultBase.java:322)
>>
>> The generated methods are:
>> RichFaultBase:
>>    public RichPerson getCaller() {
>>         if (original != null && populated == null && associationLoader !=
>> null) {
>>             populated = associationLoader.populateAssociations(original);
>>
>>             if (populated.getCaller() != null) {
>>                 caller = new RichPerson();
>>                 caller.fromModel(populated.getCaller()); //line 322
>>             } else {
>>                 caller = null;
>>             }
>>         }
>>         return caller;
>>     }
>>
>> and RichPerson:
>>     public void fromModel(Person model) {
>>         original = model;
>>
>>         populated = null;
>>
>>         setAddressStreet(model.getAddress().getStreet()); // line 305
>>         ....
>>     }
>>
>> Whats wrong here? Why does the object at client side needs/knows the
>> hibernate sessions from the last findAll<Fault>() method call?
>>
>> Could I use BasicType here?
>>
>> Regards
>>    Steffen...
>>
> 

-- 
Steffen Stundzig

Telefon: +49 (0) 341 / 231-0183-401
Telefax: +49 (0) 341 / 231-0183-411
Mobil:   +49 (0) 151 / 173-9673-1 (!neu)

http://itemis.de
steffen.stund...@itemis.de
https://www.xing.com/profile/Steffen_Stundzig

itemis AG
Niederlassung Leipzig
Ludwig-Erhard-Straße 51
04103 Leipzig

Rechtlicher Hinweis:
Registergericht: Amtsgericht Dortmund HRB 20621
Sitz der Gesellschaft: 44536 Lünen, Am Brambusch 15-24
Vorstand: Wolfgang Neuhaus, Jens Wagener, Dr. Georg Pietrek
Aufsichtsrat: Prof. Dr. Burkhard Igel (Vorsitzender), Stephan Grollmann, 
Michael Neuhaus



------------------------------------------------------------------------------
_______________________________________________
Fornax-developer mailing list
Fornax-developer@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/fornax-developer

Reply via email to