public interface EbeanServer
Registration with the Ebean Singleton:
When a EbeanServer is constructed it can be registered with the Ebean
singleton (see ServerConfig.setRegister(boolean)
). The Ebean
singleton is essentially a map of EbeanServer's that have been registered
with it. The EbeanServer can then be retrieved later via
Ebean.getServer(String)
.
The 'default' EbeanServer
One EbeanServer can be designated as the 'default' or 'primary' EbeanServer
(see ServerConfig.setDefaultServer(boolean)
. Many methods on Ebean
such as Ebean.find(Class)
etc are actually just a convenient way to
call methods on the 'default/primary' EbeanServer. This is handy for
applications that use a single DataSource.
There is one EbeanServer per Database (javax.sql.DataSource). One EbeanServer
is referred to as the 'default' server and that is the one that
Ebean methods such as Ebean.find(Class)
use.
Constructing a EbeanServer
EbeanServer's are constructed by the EbeanServerFactory. They can be created
programmatically via EbeanServerFactory.create(ServerConfig)
or they
can be automatically constructed on demand using configuration information in
the ebean.properties file.
Example: Get a EbeanServer
// Get access to the Human Resources EbeanServer/Database
EbeanServer hrServer = Ebean.getServer("HR");
// fetch contact 3 from the HR database Contact contact =
hrServer.find(Contact.class, new Integer(3));
contact.setStatus("INACTIVE"); ...
// save the contact back to the HR database hrServer.save(contact);
EbeanServer has more API than Ebean
EbeanServer provides additional API compared with Ebean. For example it
provides more control over the use of Transactions that is not available in
the Ebean API.
External Transactions: If you wanted to use transactions created externally to eBean then EbeanServer provides additional methods where you can explicitly pass a transaction (that can be created externally).
Bypass ThreadLocal Mechanism: If you want to bypass the built in ThreadLocal transaction management you can use the createTransaction() method. Example: a single thread requires more than one transaction.
Ebean
,
EbeanServerFactory
,
ServerConfig
Modifier and Type | Method and Description |
---|---|
Transaction |
beginTransaction()
Start a transaction with 'REQUIRED' semantics.
|
Transaction |
beginTransaction(io.ebean.annotation.TxIsolation isolation)
Start a transaction additionally specifying the isolation level.
|
Transaction |
beginTransaction(TxScope scope)
Start a transaction typically specifying REQUIRES_NEW or REQUIRED semantics.
|
Set<Property> |
checkUniqueness(Object bean)
This method checks the uniqueness of a bean.
|
Set<Property> |
checkUniqueness(Object bean,
Transaction transaction)
Same as
checkUniqueness(Object) . |
void |
commitTransaction()
Commit the current transaction.
|
CallableSql |
createCallableSql(String callableSql)
Create a CallableSql to execute a given stored procedure.
|
<T> CsvReader<T> |
createCsvReader(Class<T> beanType)
Create a CsvReader for a given beanType.
|
<T> T |
createEntityBean(Class<T> type)
Create a new instance of T that is an EntityBean.
|
<T> DtoQuery<T> |
createNamedDtoQuery(Class<T> dtoType,
String namedQuery)
Create a named Query for DTO beans.
|
<T> Query<T> |
createNamedQuery(Class<T> beanType,
String namedQuery)
Create a named query.
|
<T> Query<T> |
createQuery(Class<T> beanType)
Create a query for an entity bean and synonym for
find(Class) . |
<T> Query<T> |
createQuery(Class<T> beanType,
String ormQuery)
Parse the Ebean query language statement returning the query which can then
be modified (add expressions, change order by clause, change maxRows, change
fetch and select paths etc).
|
SqlQuery |
createSqlQuery(String sql)
Create a SqlQuery for executing native sql
query statements.
|
SqlUpdate |
createSqlUpdate(String sql)
Create a sql update for executing native dml statements.
|
Transaction |
createTransaction()
Create a new transaction that is not held in TransactionThreadLocal.
|
Transaction |
createTransaction(io.ebean.annotation.TxIsolation isolation)
Create a new transaction additionally specifying the isolation level.
|
<T> Update<T> |
createUpdate(Class<T> beanType,
String ormUpdate)
Create a orm update where you will supply the insert/update or delete
statement (rather than using a named one that is already defined using the
@NamedUpdates annotation).
|
Transaction |
currentTransaction()
Returns the current transaction or null if there is no current transaction in scope.
|
int |
delete(Class<?> beanType,
Object id)
Delete the bean given its type and id.
|
int |
delete(Class<?> beanType,
Object id,
Transaction transaction)
Delete the bean given its type and id with an explicit transaction.
|
boolean |
delete(Object bean)
Delete the bean.
|
boolean |
delete(Object bean,
Transaction transaction)
Delete the bean with an explicit transaction.
|
int |
deleteAll(Class<?> beanType,
Collection<?> ids)
Delete several beans given their type and id values.
|
int |
deleteAll(Class<?> beanType,
Collection<?> ids,
Transaction transaction)
Delete several beans given their type and id values with an explicit transaction.
|
int |
deleteAll(Collection<?> beans)
Delete all the beans in the collection.
|
int |
deleteAll(Collection<?> beans,
Transaction transaction)
Delete all the beans in the collection using an explicit transaction.
|
int |
deleteAllPermanent(Class<?> beanType,
Collection<?> ids)
Delete permanent for several beans given their type and id values.
|
int |
deleteAllPermanent(Class<?> beanType,
Collection<?> ids,
Transaction transaction)
Delete permanent for several beans given their type and id values with an explicit transaction.
|
int |
deleteAllPermanent(Collection<?> beans)
Delete all the beans in the collection permanently without soft delete.
|
int |
deleteAllPermanent(Collection<?> beans,
Transaction transaction)
Delete all the beans in the collection permanently without soft delete using an explicit transaction.
|
int |
deletePermanent(Class<?> beanType,
Object id)
Delete permanent given the bean type and id.
|
int |
deletePermanent(Class<?> beanType,
Object id,
Transaction transaction)
Delete permanent given the bean type and id with an explicit transaction.
|
boolean |
deletePermanent(Object bean)
Delete a bean permanently without soft delete.
|
boolean |
deletePermanent(Object bean,
Transaction transaction)
Delete a bean permanently without soft delete using an explicit transaction.
|
Map<String,ValuePair> |
diff(Object newBean,
Object oldBean)
Return a map of the differences between two objects of the same type.
|
DocumentStore |
docStore()
Return the Document store.
|
<T> T |
draftRestore(Class<T> beanType,
Object id)
Restore the draft bean back to the live state.
|
<T> T |
draftRestore(Class<T> beanType,
Object id,
Transaction transaction)
Restore the draft bean back to the live state.
|
<T> List<T> |
draftRestore(Query<T> query)
Restore the draft beans matching the query back to the live state.
|
<T> List<T> |
draftRestore(Query<T> query,
Transaction transaction)
Restore the draft beans matching the query back to the live state.
|
void |
endTransaction()
If the current transaction has already been committed do nothing otherwise
rollback the transaction.
|
int |
execute(CallableSql callableSql)
For making calls to stored procedures.
|
int |
execute(CallableSql callableSql,
Transaction transaction)
Execute explicitly passing a transaction.
|
void |
execute(Runnable runnable)
Execute a Runnable in a Transaction with the default scope.
|
int |
execute(SqlUpdate sqlUpdate)
Execute a Sql Update Delete or Insert statement.
|
int |
execute(SqlUpdate updSql,
Transaction transaction)
Execute explicitly passing a transaction.
|
void |
execute(TxScope scope,
Runnable runnable)
Execute a Runnable in a Transaction with an explicit scope.
|
int |
execute(Update<?> update)
Execute a ORM insert update or delete statement using the current
transaction.
|
int |
execute(Update<?> update,
Transaction transaction)
Execute a ORM insert update or delete statement with an explicit
transaction.
|
<T> T |
executeCall(Callable<T> callable)
Execute a TxCallable in a Transaction with the default scope.
|
<T> T |
executeCall(TxScope scope,
Callable<T> callable)
Execute a TxCallable in a Transaction with an explicit scope.
|
ExtendedServer |
extended()
Return the extended API for EbeanServer.
|
void |
externalModification(String tableName,
boolean inserted,
boolean updated,
boolean deleted)
Inform Ebean that tables have been modified externally.
|
<T> Filter<T> |
filter(Class<T> beanType)
Create a filter for sorting and filtering lists of entities locally without
going back to the database.
|
<T> Query<T> |
find(Class<T> beanType)
Create a query for a type of entity bean.
|
<T> T |
find(Class<T> beanType,
Object id)
Find a bean using its unique id.
|
<T> T |
find(Class<T> beanType,
Object id,
Transaction transaction)
Find a entity bean with an explicit transaction.
|
<T> DtoQuery<T> |
findDto(Class<T> dtoType,
String sql)
Create a Query for DTO beans.
|
<T> Query<T> |
findNative(Class<T> beanType,
String nativeSql)
Create a query using native SQL.
|
void |
flush()
Flush the JDBC batch on the current transaction.
|
AutoTune |
getAutoTune()
Return AutoTune which is used to control the AutoTune service at runtime.
|
BackgroundExecutor |
getBackgroundExecutor()
Return the BackgroundExecutor service for asynchronous processing of
queries.
|
Object |
getBeanId(Object bean)
Return the value of the Id property for a given bean.
|
BeanState |
getBeanState(Object bean)
Return the BeanState for a given entity bean.
|
ExpressionFactory |
getExpressionFactory()
Return the ExpressionFactory for this server.
|
MetaInfoManager |
getMetaInfoManager()
Return the MetaInfoManager which is used to get meta data from the EbeanServer
such as query execution statistics.
|
String |
getName()
Return the name.
|
SpiServer |
getPluginApi()
Return the extended API intended for use by plugins.
|
<T> T |
getReference(Class<T> beanType,
Object id)
Get a reference object.
|
ServerCacheManager |
getServerCacheManager()
Return the manager of the server cache ("L2" cache).
|
void |
insert(Object bean)
Insert the bean.
|
void |
insert(Object bean,
Transaction transaction)
Insert the bean with a transaction.
|
void |
insertAll(Collection<?> beans)
Insert a collection of beans.
|
void |
insertAll(Collection<?> beans,
Transaction transaction)
Insert a collection of beans with an explicit transaction.
|
JsonContext |
json()
Return the JsonContext for reading/writing JSON.
|
void |
markAsDirty(Object bean)
Marks the entity bean as dirty.
|
void |
merge(Object bean)
Merge the bean using the default merge options (no paths specified, default delete).
|
void |
merge(Object bean,
MergeOptions options)
Merge the bean using the given merge options.
|
void |
merge(Object bean,
MergeOptions options,
Transaction transaction)
Merge the bean using the given merge options and a transaction.
|
Object |
nextId(Class<?> beanType)
Return the next unique identity value for a given bean type.
|
<T> T |
publish(Class<T> beanType,
Object id)
Publish a single bean given its type and id returning the resulting live bean.
|
<T> T |
publish(Class<T> beanType,
Object id,
Transaction transaction)
Publish a single bean given its type and id returning the resulting live bean.
|
<T> List<T> |
publish(Query<T> query)
Publish the beans that match the query returning the resulting published beans.
|
<T> List<T> |
publish(Query<T> query,
Transaction transaction)
Publish the beans that match the query returning the resulting published beans.
|
void |
refresh(Object bean)
Refresh the values of a bean.
|
void |
refreshMany(Object bean,
String propertyName)
Refresh a many property of an entity bean.
|
void |
register(TransactionCallback transactionCallback)
Register a TransactionCallback on the currently active transaction.
|
void |
rollbackTransaction()
Rollback the current transaction.
|
void |
save(Object bean)
Either Insert or Update the bean depending on its state.
|
void |
save(Object bean,
Transaction transaction)
Insert or update a bean with an explicit transaction.
|
int |
saveAll(Collection<?> beans)
Save all the beans in the collection.
|
int |
saveAll(Collection<?> beans,
Transaction transaction)
Save all the beans in the collection with an explicit transaction.
|
ScriptRunner |
script()
Return a ScriptRunner for running SQL or DDL scripts.
|
Object |
setBeanId(Object bean,
Object id)
Set the Id value onto the bean converting the type of the id value if necessary.
|
void |
shutdown(boolean shutdownDataSource,
boolean deregisterDriver)
Shutdown the EbeanServer programmatically.
|
<T> void |
sort(List<T> list,
String sortByClause)
Sort the list in memory using the sortByClause which can contain a comma delimited
list of property names and keywords asc, desc, nullsHigh and nullsLow.
|
<T> UpdateQuery<T> |
update(Class<T> beanType)
Create an Update query to perform a bulk update.
|
void |
update(Object bean)
Saves the bean using an update.
|
void |
update(Object bean,
Transaction transaction)
Update a bean additionally specifying a transaction.
|
void |
update(Object bean,
Transaction transaction,
boolean deleteMissingChildren)
Update a bean additionally specifying a transaction and the deleteMissingChildren setting.
|
void |
updateAll(Collection<?> beans)
Update a collection of beans.
|
void |
updateAll(Collection<?> beans,
Transaction transaction)
Update a collection of beans with an explicit transaction.
|
<T> Set<String> |
validateQuery(Query<T> query)
Returns the set of properties/paths that are unknown (do not map to known properties or paths).
|
void shutdown(boolean shutdownDataSource, boolean deregisterDriver)
This method is not normally required. Ebean registers a shutdown hook and shuts down cleanly.
If the under underlying DataSource is the Ebean implementation then you also have the option of shutting down the DataSource and deregistering the JDBC driver.
shutdownDataSource
- if true then shutdown the underlying DataSource if it is the EbeanORM
DataSource implementation.deregisterDriver
- if true then deregister the JDBC driver if it is the EbeanORM
DataSource implementation.AutoTune getAutoTune()
String getName()
Ebean.getServer(String)
to get a
EbeanServer that was registered with the Ebean singleton.ExpressionFactory getExpressionFactory()
MetaInfoManager getMetaInfoManager()
SpiServer getPluginApi()
BeanState getBeanState(Object bean)
This will return null if the bean is not an enhanced entity bean.
Object setBeanId(Object bean, Object id)
For example, if the id value passed in is a String but ought to be a Long or UUID etc then it will automatically be converted.
bean
- The entity bean to set the id value on.id
- The id value to set.Map<String,ValuePair> diff(Object newBean, Object oldBean)
When null is passed in for b, then the 'OldValues' of a is used for the difference comparison.
<T> T createEntityBean(Class<T> type)
Useful if you use BeanPostConstructListeners or @PostConstruct Annotations. In this case you should not use "new Bean...()". Making all bean construtors protected could be a good idea here.
<T> CsvReader<T> createCsvReader(Class<T> beanType)
<T> UpdateQuery<T> update(Class<T> beanType)
int rows = ebeanServer
.update(Customer.class)
.set("status", Customer.Status.ACTIVE)
.set("updtime", new Timestamp(System.currentTimeMillis()))
.where()
.gt("id", 1000)
.update();
T
- The type of entity beanbeanType
- The type of entity bean to update<T> Query<T> createNamedQuery(Class<T> beanType, String namedQuery)
For RawSql the named query is expected to be in ebean.xml.
T
- The type of entity beanbeanType
- The type of entity beannamedQuery
- The name of the query<T> Query<T> createQuery(Class<T> beanType)
find(Class)
.find(Class)
<T> Query<T> createQuery(Class<T> beanType, String ormQuery)
// Find order additionally fetching the customer, details and details.product name.
String ormQuery = "fetch customer fetch details fetch details.product (name) where id = :orderId ";
Query<Order> query = Ebean.createQuery(Order.class, ormQuery);
query.setParameter("orderId", 2);
Order order = query.findOne();
// This is the same as:
Order order = Ebean.find(Order.class)
.fetch("customer")
.fetch("details")
.fetch("detail.product", "name")
.setId(2)
.findOne();
T
- The type of the entity beanbeanType
- The type of bean to fetchormQuery
- The Ebean ORM query<T> Query<T> find(Class<T> beanType)
You can use the methods on the Query object to specify fetch paths, predicates, order by, limits etc.
You then use findList(), findSet(), findMap() and findOne() to execute the query and return the collection or bean.
Note that a query executed by Query.findList()
Query.findSet()
etc will execute against the same EbeanServer from
which is was created.
// Find order 2 specifying explicitly the parts of the object graph to
// eagerly fetch. In this case eagerly fetch the associated customer,
// details and details.product.name
Order order = ebeanServer.find(Order.class)
.fetch("customer")
.fetch("details")
.fetch("detail.product", "name")
.setId(2)
.findOne();
// find some new orders ... with firstRow/maxRows
List<Order> orders =
ebeanServer.find(Order.class)
.where().eq("status", Order.Status.NEW)
.setFirstRow(20)
.setMaxRows(10)
.findList();
<T> Query<T> findNative(Class<T> beanType, String nativeSql)
The native SQL can contain named parameters or positioned parameters.
String sql = "select c.id, c.name from customer c where c.name like ? order by c.name";
Query<Customer> query = ebeanServer.findNative(Customer.class, sql);
query.setParameter(1, "Rob%");
List<Customer> customers = query.findList();
beanType
- The type of entity bean to fetchnativeSql
- The SQL that can contain named or positioned parametersObject nextId(Class<?> beanType)
This will only work when a IdGenerator is on the bean such as for beans that use a DB sequence or UUID.
For DB's supporting getGeneratedKeys and sequences such as Oracle10 you do not need to use this method generally. It is made available for more complex cases where it is useful to get an ID prior to some processing.
<T> Filter<T> filter(Class<T> beanType)
This produces and returns a new list with the sort and filters applied.
Refer to Filter
for an example of its use.
<T> void sort(List<T> list, String sortByClause)
If you leave off any keywords the defaults are ascending order and treating nulls as high values.
Note that the sorting uses a Comparator and Collections.sort(); and does not invoke a DB query.
// find orders and their customers
List<Order> list = ebeanServer.find(Order.class)
.fetch("customer")
.orderBy("id")
.findList();
// sort by customer name ascending, then by order shipDate
// ... then by the order status descending
ebeanServer.sort(list, "customer.name, shipDate, status desc");
// sort by customer name descending (with nulls low)
// ... then by the order id
ebeanServer.sort(list, "customer.name desc nullsLow, id");
list
- the list of entity beanssortByClause
- the properties to sort the list by<T> Update<T> createUpdate(Class<T> beanType, String ormUpdate)
The orm update differs from the sql update in that it you can use the bean name and bean property names rather than table and column names.
An example:
// The bean name and properties - "topic","postCount" and "id"
// will be converted into their associated table and column names
String updStatement = "update topic set postCount = :pc where id = :id";
Update<Topic> update = ebeanServer.createUpdate(Topic.class, updStatement);
update.set("pc", 9);
update.set("id", 3);
int rows = update.execute();
System.out.println("rows updated:" + rows);
<T> DtoQuery<T> findDto(Class<T> dtoType, String sql)
DTO beans are just normal bean like classes with public constructor(s) and setters. They do not need to be registered with Ebean before use.
T
- The type of the DTO bean.dtoType
- The type of the DTO bean the rows will be mapped into.sql
- The SQL query to execute.<T> DtoQuery<T> createNamedDtoQuery(Class<T> dtoType, String namedQuery)
DTO beans are just normal bean like classes with public constructor(s) and setters. They do not need to be registered with Ebean before use.
T
- The type of the DTO bean.dtoType
- The type of the DTO bean the rows will be mapped into.namedQuery
- The name of the querySqlQuery createSqlQuery(String sql)
Note that you can use raw SQL with entity beans, refer to the SqlSelect annotation for examples.
SqlUpdate createSqlUpdate(String sql)
Use this to execute a Insert Update or Delete statement. The statement will be native to the database and contain database table and column names.
See SqlUpdate
for example usage.
CallableSql createCallableSql(String callableSql)
void register(TransactionCallback transactionCallback) throws javax.persistence.PersistenceException
transactionCallback
- The transaction callback to be registered with the current transaction.javax.persistence.PersistenceException
- If there is no currently active transactionTransaction createTransaction()
You will want to do this if you want multiple Transactions in a single thread or generally use transactions outside of the TransactionThreadLocal management.
Transaction createTransaction(io.ebean.annotation.TxIsolation isolation)
Note that this transaction is NOT stored in a thread local.
Transaction beginTransaction()
With REQUIRED semantics if an active transaction already exists that transaction will be used.
The transaction is stored in a ThreadLocal variable and typically you only need to use the returned Transaction IF you wish to do things like use batch mode, change the transaction isolation level, use savepoints or log comments to the transaction log.
Example of using a transaction to span multiple calls to find(), save() etc.
// start a transaction (stored in a ThreadLocal)
try (Transaction txn = ebeanServer.beginTransaction()) {
Order order = ebeanServer.find(Order.class,10);
...
ebeanServer.save(order);
txn.commit();
}
// start a transaction (stored in a ThreadLocal)
Transaction txn = ebeanServer.beginTransaction();
try {
Order order = ebeanServer.find(Order.class,10);
ebeanServer.save(order);
txn.commit();
} finally {
txn.end();
}
try (Transaction txn = ebeanServer.beginTransaction()) {
// explicitly turn on/off JDBC batch use
txn.setBatchMode(true);
txn.setBatchSize(50);
// control flushing when mixing save and queries
txn.setBatchFlushOnQuery(false);
// turn off persist cascade if needed
txn.setPersistCascade(false);
// for large batch insert processing when we do not
// ... need the generatedKeys, don't get them
txn.setBatchGetGeneratedKeys(false);
// explicitly flush the JDBC batch buffer
txn.flush();
...
txn.commit();
}
If you want to externalise the transaction management then you use createTransaction() and pass the transaction around to the various methods on EbeanServer yourself.
Transaction beginTransaction(io.ebean.annotation.TxIsolation isolation)
Transaction beginTransaction(TxScope scope)
Note that this provides an try finally alternative to using executeCall(TxScope, Callable)
or
execute(TxScope, Runnable)
.
// Start a new transaction. If there is a current transaction
// suspend it until this transaction ends
try (Transaction txn = server.beginTransaction(TxScope.requiresNew())) {
...
// commit the transaction
txn.commit();
// At end this transaction will:
// A) will rollback transaction if it has not been committed
// B) will restore a previously suspended transaction
}
// start a new transaction if there is not a current transaction
try (Transaction txn = server.beginTransaction(TxScope.required())) {
...
// commit the transaction if it was created or
// do nothing if there was already a current transaction
txn.commit();
}
Transaction currentTransaction()
void flush()
This only is useful when JDBC batch is used. Flush occurs automatically when the transaction commits or batch size is reached. This manually flushes the JDBC batch buffer.
This is the same as currentTransaction().flush()
.
void commitTransaction()
void rollbackTransaction()
void endTransaction()
Useful to put in a finally block to ensure the transaction is ended, rather than a rollbackTransaction() in each catch block.
Code example:
ebeanServer.beginTransaction();
try {
// do some fetching and or persisting ...
// commit at the end
ebeanServer.commitTransaction();
} finally {
// if commit didn't occur then rollback the transaction
ebeanServer.endTransaction();
}
void refresh(Object bean)
Note that this resets OneToMany and ManyToMany properties so that if they are accessed a lazy load will refresh the many property.
void refreshMany(Object bean, String propertyName)
bean
- the entity bean containing the 'many' propertypropertyName
- the 'many' property to be refreshed@Nullable <T> T find(Class<T> beanType, Object id)
// Fetch order 1
Order order = ebeanServer.find(Order.class, 1);
If you want more control over the query then you can use createQuery() and Query.findOne();
// ... additionally fetching customer, customer shipping address,
// order details, and the product associated with each order detail.
// note: only product id and name is fetch (its a "partial object").
// note: all other objects use "*" and have all their properties fetched.
Query<Order> query = ebeanServer.find(Order.class)
.setId(1)
.fetch("customer")
.fetch("customer.shippingAddress")
.fetch("details")
.query();
// fetch associated products but only fetch their product id and name
query.fetch("details.product", "name");
Order order = query.findOne();
// traverse the object graph...
Customer customer = order.getCustomer();
Address shippingAddress = customer.getShippingAddress();
List<OrderDetail> details = order.getDetails();
OrderDetail detail0 = details.get(0);
Product product = detail0.getProduct();
String productName = product.getName();
beanType
- the type of entity bean to fetchid
- the id value@Nonnull <T> T getReference(Class<T> beanType, Object id)
This will not perform a query against the database unless some property other that the id property is accessed.
It is most commonly used to set a 'foreign key' on another bean like:
Product product = ebeanServer.getReference(Product.class, 1);
OrderDetail orderDetail = new OrderDetail();
// set the product 'foreign key'
orderDetail.setProduct(product);
orderDetail.setQuantity(42);
...
ebeanServer.save(orderDetail);
Product product = ebeanServer.getReference(Product.class, 1);
// You can get the id without causing a fetch/lazy load
Long productId = product.getId();
// If you try to get any other property a fetch/lazy loading will occur
// This will cause a query to execute...
String name = product.getName();
beanType
- the type of entity beanid
- the id valueExtendedServer extended()
The extended API has the options for executing queries that take an explicit transaction as an argument.
Typically we only need to use the extended API when we do NOT want to use the usual ThreadLocal based mechanism to obtain the current transaction but instead supply the transaction explicitly.
void save(Object bean) throws javax.persistence.OptimisticLockException
If there is no current transaction one will be created and committed for you automatically.
Save can cascade along relationships. For this to happen you need to specify a cascade of CascadeType.ALL or CascadeType.PERSIST on the OneToMany, OneToOne or ManyToMany annotation.
In this example below the details property has a CascadeType.ALL set so saving an order will also save all its details.
public class Order { ...
@OneToMany(cascade=CascadeType.ALL, mappedBy="order")
List<OrderDetail> details;
...
}
When a save cascades via a OneToMany or ManyToMany Ebean will automatically set the 'parent' object to the 'detail' object. In the example below in saving the order and cascade saving the order details the 'parent' order will be set against each order detail when it is saved.
javax.persistence.OptimisticLockException
int saveAll(Collection<?> beans) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
boolean delete(Object bean) throws javax.persistence.OptimisticLockException
This will return true if the bean was deleted successfully or JDBC batch is being used.
If there is no current transaction one will be created and committed for you automatically.
If the Bean does not have a version property (or loaded version property) and the bean does not exist then this returns false indicating that nothing was deleted. Note that, if JDBC batch mode is used then this always returns true.
javax.persistence.OptimisticLockException
boolean delete(Object bean, Transaction transaction) throws javax.persistence.OptimisticLockException
This will return true if the bean was deleted successfully or JDBC batch is being used.
If the Bean does not have a version property (or loaded version property) and the bean does not exist then this returns false indicating that nothing was deleted. However, if JDBC batch mode is used then this always returns true.
javax.persistence.OptimisticLockException
boolean deletePermanent(Object bean) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
boolean deletePermanent(Object bean, Transaction transaction) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
int deleteAllPermanent(Collection<?> beans) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
int deleteAllPermanent(Collection<?> beans, Transaction transaction) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
int delete(Class<?> beanType, Object id, Transaction transaction)
int deletePermanent(Class<?> beanType, Object id)
int deletePermanent(Class<?> beanType, Object id, Transaction transaction)
int deleteAll(Collection<?> beans) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
int deleteAll(Collection<?> beans, Transaction transaction) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
int deleteAll(Class<?> beanType, Collection<?> ids)
int deleteAll(Class<?> beanType, Collection<?> ids, Transaction transaction)
int deleteAllPermanent(Class<?> beanType, Collection<?> ids)
int deleteAllPermanent(Class<?> beanType, Collection<?> ids, Transaction transaction)
int execute(SqlUpdate sqlUpdate)
If you wish to execute a Sql Select natively then you should use the SqlQuery object or DtoQuery.
Note that the table modification information is automatically deduced and you do not need to call the Ebean.externalModification() method when you use this method.
Example:
// example that uses 'named' parameters
String s = "UPDATE f_topic set post_count = :count where id = :id"
SqlUpdate update = ebeanServer.createSqlUpdate(s);
update.setParameter("id", 1);
update.setParameter("count", 50);
int modifiedCount = ebeanServer.execute(update);
String msg = "There where " + modifiedCount + "rows updated";
sqlUpdate
- the update sql potentially with bind valuesCallableSql
int execute(Update<?> update)
This returns the number of rows that where inserted, updated or deleted.
int execute(Update<?> update, Transaction transaction)
int execute(CallableSql callableSql)
Example:
String sql = "{call sp_order_modify(?,?,?)}";
CallableSql cs = ebeanServer.createCallableSql(sql);
cs.setParameter(1, 27);
cs.setParameter(2, "SHIPPED");
cs.registerOut(3, Types.INTEGER);
ebeanServer.execute(cs);
// read the out parameter
Integer returnValue = (Integer) cs.getObject(3);
CallableSql
,
Ebean.execute(SqlUpdate)
void externalModification(String tableName, boolean inserted, boolean updated, boolean deleted)
If you use ebeanServer.execute(UpdateSql) then the table modification information is automatically deduced and you do not need to call this method yourself.
This information is used to invalidate objects out of the cache and potentially text indexes. This information is also automatically broadcast across the cluster.
If there is a transaction then this information is placed into the current transactions event information. When the transaction is committed this information is registered (with the transaction manager). If this transaction is rolled back then none of the transaction event information registers including the information you put in via this method.
If there is NO current transaction when you call this method then this information is registered immediately (with the transaction manager).
tableName
- the name of the table that was modifiedinserted
- true if rows where inserted into the tableupdated
- true if rows on the table where updateddeleted
- true if rows on the table where deleted<T> T find(Class<T> beanType, Object id, Transaction transaction)
T
- the type of entity bean to findbeanType
- the type of entity bean to findid
- the bean id valuetransaction
- the transaction to use (can be null)void save(Object bean, Transaction transaction) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
int saveAll(Collection<?> beans, Transaction transaction) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
@Nonnull Set<Property> checkUniqueness(Object bean)
Note: This method queries the DB for uniqueness of all indices, so do not use it in a batch update.
Note: This checks only the root bean!
// there is a unique constraint on title
Document doc = new Document();
doc.setTitle("One flew over the cuckoo's nest");
doc.setBody("clashes with doc1");
Set<Property> properties = server().checkUniqueness(doc);
if (properties.isEmpty()) {
// it is unique ... carry on
} else {
// build a user friendly message
// to return message back to user
String uniqueProperties = properties.toString();
StringBuilder msg = new StringBuilder();
properties.forEach((it)-> {
Object propertyValue = it.getVal(doc);
String propertyName = it.getName();
msg.append(" property["+propertyName+"] value["+propertyValue+"]");
});
// uniqueProperties > [title]
// custom msg > property[title] value[One flew over the cuckoo's nest]
}
bean
- The entity bean to check uniqueness on@Nonnull Set<Property> checkUniqueness(Object bean, Transaction transaction)
checkUniqueness(Object)
. but with given transaction.void markAsDirty(Object bean)
This is used so that when a bean that is otherwise unmodified is updated the version property is updated.
An unmodified bean that is saved or updated is normally skipped and this marks the bean as dirty so that it is not skipped.
Customer customer = ebeanServer.find(Customer, id);
// mark the bean as dirty so that a save() or update() will
// increment the version property
ebeanServer.markAsDirty(customer);
ebeanServer.save(customer);
void update(Object bean) throws javax.persistence.OptimisticLockException
Stateless updates: Note that the bean does not have to be previously fetched to call update().You can create a new instance and set some of its properties programmatically for via JSON/XML marshalling etc. This is described as a 'stateless update'.
Optimistic Locking: Note that if the version property is not set when update() is called then no optimistic locking is performed (internally ConcurrencyMode.NONE is used).
ServerConfig.setUpdatesDeleteMissingChildren(boolean)
: When cascade saving to a
OneToMany or ManyToMany the updatesDeleteMissingChildren setting controls if any other children
that are in the database but are not in the collection are deleted.
ServerConfig.setUpdateChangesOnly(boolean)
: The updateChangesOnly setting
controls if only the changed properties are included in the update or if all the loaded
properties are included instead.
// A 'stateless update' example
Customer customer = new Customer();
customer.setId(7);
customer.setName("ModifiedNameNoOCC");
ebeanServer.update(customer);
javax.persistence.OptimisticLockException
ServerConfig.setUpdatesDeleteMissingChildren(boolean)
,
ServerConfig.setUpdateChangesOnly(boolean)
void update(Object bean, Transaction transaction) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
void update(Object bean, Transaction transaction, boolean deleteMissingChildren) throws javax.persistence.OptimisticLockException
bean
- the bean to updatetransaction
- the transaction to use (can be null).deleteMissingChildren
- specify false if you do not want 'missing children' of a OneToMany
or ManyToMany to be automatically deleted.javax.persistence.OptimisticLockException
void updateAll(Collection<?> beans) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
void updateAll(Collection<?> beans, Transaction transaction) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockException
void merge(Object bean)
bean
- The bean to mergevoid merge(Object bean, MergeOptions options)
bean
- The bean to mergeoptions
- The options to control the mergevoid merge(Object bean, MergeOptions options, Transaction transaction)
bean
- The bean to mergeoptions
- The options to control the mergevoid insert(Object bean)
Compared to save() this forces bean to perform an insert rather than trying to decide based on the bean state. As such this is useful when you fetch beans from one database and want to insert them into another database (and you want to explicitly insert them).
void insert(Object bean, Transaction transaction)
void insertAll(Collection<?> beans)
void insertAll(Collection<?> beans, Transaction transaction)
int execute(SqlUpdate updSql, Transaction transaction)
int execute(CallableSql callableSql, Transaction transaction)
void execute(TxScope scope, Runnable runnable)
The scope can control the transaction type, isolation and rollback semantics.
// set specific transactional scope settings
TxScope scope = TxScope.requiresNew().setIsolation(TxIsolation.SERIALIZABLE);
ebeanServer.execute(scope, new Runnable() {
public void run() {
User u1 = Ebean.find(User.class, 1);
...
}
});
void execute(Runnable runnable)
The default scope runs with REQUIRED and by default will rollback on any exception (checked or runtime).
ebeanServer.execute(() -> {
User u1 = ebeanServer.find(User.class, 1);
User u2 = ebeanServer.find(User.class, 2);
u1.setName("u1 mod");
u2.setName("u2 mod");
u1.save();
u2.save();
});
<T> T executeCall(TxScope scope, Callable<T> callable)
The scope can control the transaction type, isolation and rollback semantics.
// set specific transactional scope settings
TxScope scope = TxScope.requiresNew().setIsolation(TxIsolation.SERIALIZABLE);
ebeanServer.executeCall(scope, new Callable<String>() {
public String call() {
User u1 = ebeanServer.find(User.class, 1);
...
return u1.getEmail();
}
});
<T> T executeCall(Callable<T> callable)
The default scope runs with REQUIRED and by default will rollback on any exception (checked or runtime).
ebeanServer.executeCall(new Callable<String>() {
public String call() {
User u1 = ebeanServer.find(User.class, 1);
User u2 = ebeanServer.find(User.class, 2);
u1.setName("u1 mod");
u2.setName("u2 mod");
ebeanServer.save(u1);
ebeanServer.save(u2);
return u1.getEmail();
}
});
ServerCacheManager getServerCacheManager()
BackgroundExecutor getBackgroundExecutor()
JsonContext json()
This instance is safe to be used concurrently by multiple threads and this method is cheap to call.
JsonContext json = ebeanServer.json();
String jsonOutput = json.toJson(list);
System.out.println(jsonOutput);
// specify just the properties we want
PathProperties paths = PathProperties.parse("name, status, anniversary");
List<Customer> customers =
ebeanServer.find(Customer.class)
// apply those paths to the query (only fetch what we need)
.apply(paths)
.where().ilike("name", "rob%")
.findList();
// ... get the json
JsonContext jsonContext = ebeanServer.json();
String json = jsonContext.toJson(customers, paths);
FetchPath
,
Query.apply(FetchPath)
ScriptRunner script()
DocumentStore docStore()
<T> T publish(Class<T> beanType, Object id, Transaction transaction)
The values are published from the draft to the live bean.
T
- the type of the entity beanbeanType
- the type of the entity beanid
- the id of the entity beantransaction
- the transaction the publish process should use (can be null)<T> T publish(Class<T> beanType, Object id)
The values are published from the draft to the live bean.
T
- the type of the entity beanbeanType
- the type of the entity beanid
- the id of the entity bean<T> List<T> publish(Query<T> query, Transaction transaction)
The values are published from the draft beans to the live beans.
T
- the type of the entity beanquery
- the query used to select the draft beans to publishtransaction
- the transaction the publish process should use (can be null)<T> List<T> publish(Query<T> query)
The values are published from the draft beans to the live beans.
T
- the type of the entity beanquery
- the query used to select the draft beans to publish<T> T draftRestore(Class<T> beanType, Object id, Transaction transaction)
The values from the live beans are set back to the draft bean and the
@DraftDirty
and @DraftReset
properties are reset.
T
- the type of the entity beanbeanType
- the type of the entity beanid
- the id of the entity bean to restoretransaction
- the transaction the restore process should use (can be null)<T> T draftRestore(Class<T> beanType, Object id)
The values from the live beans are set back to the draft bean and the
@DraftDirty
and @DraftReset
properties are reset.
T
- the type of the entity beanbeanType
- the type of the entity beanid
- the id of the entity bean to restore<T> List<T> draftRestore(Query<T> query, Transaction transaction)
The values from the live beans are set back to the draft bean and the
@DraftDirty
and @DraftReset
properties are reset.
T
- the type of the entity beanquery
- the query used to select the draft beans to restoretransaction
- the transaction the restore process should use (can be null)<T> List<T> draftRestore(Query<T> query)
The values from the live beans are set back to the draft bean and the
@DraftDirty
and @DraftReset
properties are reset.
T
- the type of the entity beanquery
- the query used to select the draft beans to restore<T> Set<String> validateQuery(Query<T> query)
Validate the query checking the where and orderBy expression paths to confirm if they represent valid properties/path for the given bean type.
Copyright © 2019. All rights reserved.