As discussed in DataContext chapter, any changes made to the DataObjects via "set*" methods are synchronized with the database by calling DataContext.commitChanges. Here is an example showing how the Painting object is fetched, modified and saved back. The following modifications are performed: the price of the first retrieved painting is doubled, a new painting is added that belongs to the same artist as the painting fetched before:

import java.math.BigDecimal;
import java.util.List;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.query.SelectQuery;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.art.Painting;
import org.apache.art.Artist;
...

// assume this exists and initialized
DataContext ctxt;
...
Expression e =
  ExpressionFactory.greaterExp("estimatedPrice",
                        new BigDecimal(100000.0));
SelectQuery q = new SelectQuery(Painting.class, e);
List realExpensiveArt = ctxt.performQuery(q);

if(realExpensiveArt.size() > 0) {
  Painting firstPainting = (Painting)realExpensiveArt.get(0);

  // double the price
  double oldPrice = firstPainting.getEstimatedPrice().doubleValue();
  firstPainting.setEstimatedPrice(new BigDecimal(oldPrice * 2.00));

  // create new painting and register it with DataContext
  // "Painting" string is a name of ObjEntity in the DataMap
  Painting newPainting = (Painting)ctxt.newObject(Painting.class);
  newPainting.setPaintingTitle("Sunset as it is");

  // price it as unreasonable as other paintings
  newPainting.setEstimatedPrice(new BigDecimal(5000000.0));

  // get artist via relationship
  Artist artist = firstPainting.getToArtist();

  // assign new painting to an artist
  artist.addToPaintingArray(newPainting);

  // save all the changes we've made so far
  ctxt.commitChanges();
}
...

If SQL tracing is turned on, and depending on the preexisting data in the database, the following SQL statements might be printed to console during the commit phase:

[main 12-22 15:50:19] QueryLogger: --- will run 2 queries.
[main 12-22 15:50:19] QueryLogger: INSERT INTO PAINTING (PAINTING_ID, PAINTING_TITLE, ESTIMATED_PRICE,
 ARTIST_ID) VALUES (?, ?, ?, ?) [params: 200, 'Sunset as it is', 5000000, 10]
[main 12-22 15:50:19] QueryLogger: === updated 1 row.
[main 12-22 15:50:19] QueryLogger: UPDATE PAINTING SET ESTIMATED_PRICE = ? WHERE PAINTING_ID = ? 
 [params: 2000000, 34]
[main 12-22 15:50:19] QueryLogger: === updated 1 row.
[main 12-22 15:50:19] QueryLogger: +++ transaction committed.