[ 
https://issues.apache.org/jira/browse/LABS-165?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14031843#comment-14031843
 ] 

jan iversen commented on LABS-165:
----------------------------------

Is this still an issue, if not please close it (or let me close it)

> DATABASE-WEB : transactions should be more careful
> --------------------------------------------------
>
>                 Key: LABS-165
>                 URL: https://issues.apache.org/jira/browse/LABS-165
>             Project: Labs
>          Issue Type: Improvement
>          Components: Magma
>    Affects Versions: Current
>            Reporter: Simone Gianni
>            Assignee: Simone Gianni
>             Fix For: Future
>
>
> Currently, in a web environment, all the web page lives in a single 
> transaction. This is somewhat dangerous. First of all, a small error in a 
> subcomponent could make all the page fail, also on the database, but this is 
> not a big concern because it is what many other frameworks out there does.
> The biggest problem is another one : there is no way to avoid committing 
> partial stuff. For example, I may have a form that modifies a bean. If 
> validation fails, there is a small (thanks to the handler) but yet possible 
> situation where the bean is partially modified. In this case, by default, JPA 
> will persist changes if the transaction is flushed and committed, also if 
> Database.save() is not explicitly called.
> Also, the user could naively modify the bean thinking that, since 
> Database.save is not called, the data on the database will stay there and not 
> be modified by anyone.
> There could be a number of approaches to solve these problems :
>     * The JPA implementation should be configured to flush to the database 
> only stuff which has been explicitly required thru a Database.save operation 
> ... this was possible in Hibernate, no idea if there is a standard way to do 
> it in JPA.
>     * The Database implementation should do this on behalf of JPA. As a first 
> step to commit the transaction only if Database.save has been called at least 
> once. Second refreshing bean state for those beans not interested directly in 
> a save operation before committing. 
> This second approach is quite hard to achieve : first of all we need access 
> to all beans returned by JPA and currently in the entity manager. 
> Intercepting the query methods and building the index by ourselves is not 
> simple, cause the returned collection will probably be lazy, so wrapping of 
> this collection should take place. At that point, before committing, all 
> elements in the "databsse objects pool" which does not have a corresponding 
> "save" statement should be refreshed. Again, this could be a problem, cause 
> changes could have been performed on a sub-bean retrieved by a query, and 
> then saved saving the parent, as in the following snippet :
> Address address = db.load(Address.class, 150);
> address.setZipCode("00131");
> Person p = address.getPerson();
> db.save(p);
> This is perfectly legal JPA code (if the relation person->address propagates 
> updates), that will persist the person to persiste changes in address. In 
> this case, the address should not be rolled back. 



--
This message was sent by Atlassian JIRA
(v6.2#6252)

---------------------------------------------------------------------
To unsubscribe, e-mail: labs-unsubscr...@labs.apache.org
For additional commands, e-mail: labs-h...@labs.apache.org

Reply via email to