package io.ebeaninternal.server.persist.dml;
import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.util.StringHelper;
import io.ebeaninternal.server.core.PersistRequestBean;
import io.ebeaninternal.server.persist.BeanPersister;
import java.sql.SQLException;
Bean persister that uses the Handler and Meta objects.
The design of this is based on the immutable Meta objects. They hold a
information in the form of lists of Bindable objects. This effectively
flattens the structure of the bean with embedded and associated objects into
a flat list of Bindable objects.
/**
* Bean persister that uses the Handler and Meta objects.
* <p>
* The design of this is based on the immutable Meta objects. They hold a
* information in the form of lists of Bindable objects. This effectively
* flattens the structure of the bean with embedded and associated objects into
* a flat list of Bindable objects.
* </p>
*/
public final class DmlBeanPersister implements BeanPersister {
private final DatabasePlatform dbPlatform;
private final UpdateMeta updateMeta;
private final InsertMeta insertMeta;
private final DeleteMeta deleteMeta;
public DmlBeanPersister(DatabasePlatform dbPlatform, UpdateMeta updateMeta, InsertMeta insertMeta, DeleteMeta deleteMeta) {
this.dbPlatform = dbPlatform;
this.updateMeta = updateMeta;
this.insertMeta = insertMeta;
this.deleteMeta = deleteMeta;
}
execute the bean delete request.
/**
* execute the bean delete request.
*/
@Override
public int delete(PersistRequestBean<?> request) {
return execute(request, new DeleteHandler(request, deleteMeta));
}
execute the bean insert request.
/**
* execute the bean insert request.
*/
@Override
public void insert(PersistRequestBean<?> request) {
execute(request, new InsertHandler(request, insertMeta));
}
execute the bean update request.
/**
* execute the bean update request.
*/
@Override
public void update(PersistRequestBean<?> request) {
execute(request, new UpdateHandler(request, updateMeta));
}
execute request taking batching into account.
/**
* execute request taking batching into account.
*/
private int execute(PersistRequestBean<?> request, PersistHandler handler) {
boolean batched = request.isBatched();
try {
handler.bind();
if (batched) {
handler.addBatch();
return -1;
} else {
return handler.execute();
}
} catch (SQLException e) {
// log the error to the transaction log
String errMsg = StringHelper.replaceStringMulti(e.getMessage(), new String[]{"\r", "\n"}, " ");
String msg = "Error[" + errMsg + "]";
if (request.getTransaction().isLogSummary()) {
request.getTransaction().logSummary(msg);
}
throw dbPlatform.translate(msg, e);
} finally {
if (!batched) {
handler.close();
}
}
}
}