Yes, the default scaffold save doesn't return the saved object. In the client
the generated code is:

        libraryService.save(createServiceContext(), updatedLibrary);
        if (isNew) {
            // new object, INSERT, but we don't have an id, so we need to
refresh
            DataEvent event =
                new DataEvent(richLibrary, DataEvent.Action.REFRESH);
            notifyView(event);

This will trigger a reload from the client. Not very efficient.
However, if the save method returns the saved object the generated code in
the client is:

        Library savedLibrary =
            libraryService.saveNew(createServiceContext(), updatedLibrary);
        richLibrary.fromModel(savedLibrary);
        this.richLibraries.put(savedLibrary.getKey(), richLibrary);

        DataEvent event =
            new DataEvent(richLibrary,
                (isNew ? DataEvent.Action.INSERT :
DataEvent.Action.UPDATE));
        notifyView(event);

Which is much better.

It is easy to define such a save method.
model.design:
        Service LibraryService {
          @Library saveNew(@Library library);

LibraryServiceImpl:
    public Library saveNew(ServiceContext ctx, Library library) {
        save(ctx, library);
        // now the id has been assigned
        return library;
    }

JUnit test:
    public void testSaveNew() throws Exception {
        Date now = new Date();
        String name = "TestSaveNewLibrary " + now;
        Library library = new Library(name);
        Library savedLibrary = libraryService.saveNew(getServiceContext(),
library);

        Library foundLibrary =
libraryService.findLibraryByName(getServiceContext(), name);
        assertNotNull(foundLibrary);
        assertEquals(foundLibrary.getId(), savedLibrary.getId());
        assertEquals(foundLibrary, savedLibrary);
    }

model.guidesign:
    CreateTask for Library {
        createWith LibraryService.saveNew
    }


I think we should consider to always return the saved object from the
default scaffold save method.

/Patrik


Steffen Stundzig wrote:
> 
> Hi all,
> 
> I'm using parts of the generated ui code as base for my RAP UI. There 
> I've a dialog with an entity, which I need to save. The save method in 
> the service, can do that.
> 
> But now, how could i get the id of the saved object or the object 
> itself? The problem is, i could call the save method with the same 
> entity instance twice and the service stores 2 rows in the database.
> 
> The service doesnt return the primary key (id) or something else, nor 
> the uuid contains the as parameter specified entity.
> 
> There are any thoughts on that? My first idea is to enrich the 
> SaveAccessImpl to return the generated primary key of the entity, 
> similar to the save(Object)-method in the hibernate session.
> 
> regards
>     Steffen...
> 

-- 
View this message in context: 
http://www.nabble.com/-sculptor--Save-API-tp21086454s17564p21086464.html
Sent from the Fornax-Platform mailing list archive at Nabble.com.


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

Reply via email to