public final class Ebean extends Object
EbeanServers. It additionally provides a convenient way to use the
'default' EbeanServer.
If you are using a Dependency Injection framework such as
Spring or Guice you will probably
NOT use this Ebean singleton object. Instead you will
configure and construct EbeanServer instances using ServerConfig and
EbeanServerFactory and inject those EbeanServer instances into your
data access objects.
In documentation "Ebean singleton" refers to this object.
getServer(String).find(Class) that proxy through to the 'default' EbeanServer. This
can be useful for applications that use a single database.For developer convenience Ebean has static methods that proxy through to the methods on the 'default' EbeanServer. These methods are provided for developers who are mostly using a single database. Many developers will be able to use the methods on Ebean rather than get a EbeanServer.
EbeanServers can be created and used without ever needing or using the Ebean
singleton. Refer to ServerConfig.setRegister(boolean).
You can either programmatically create/register EbeanServers via
EbeanServerFactory or they can automatically be created and
registered when you first use the Ebean singleton. When EbeanServers are
created automatically they are configured using information in the
ebean.properties file.
// fetch shipped orders (and also their customer)
List<Order> list = Ebean.find(Order.class)
.fetch("customer")
.where()
.eq("status.code", Order.Status.SHIPPED)
.findList();
// read/use the order list ...
for (Order order : list) {
Customer customer = order.getCustomer();
...
}
// fetch order 10, modify and save
Order order = Ebean.find(Order.class, 10);
OrderStatus shipped = Ebean.getReference(OrderStatus.class,"SHIPPED");
order.setStatus(shipped);
order.setShippedDate(shippedDate);
...
// implicitly creates a transaction and commits
Ebean.save(order);
When you have multiple databases and need access to a specific one the
getServer(String) method provides access to the EbeanServer for that
specific database.
// Get access to the Human Resources EbeanServer/Database
EbeanServer hrDb = Ebean.getServer("hr");
// fetch contact 3 from the HR database
Contact contact = hrDb.find(Contact.class, 3);
contact.setName("I'm going to change");
...
// save the contact back to the HR database
hrDb.save(contact);
| Modifier and Type | Method and Description |
|---|---|
static Transaction |
beginTransaction()
Start a transaction with 'REQUIRED' semantics.
|
static Transaction |
beginTransaction(TxIsolation isolation)
Start a transaction additionally specifying the isolation level.
|
static Transaction |
beginTransaction(TxScope scope)
Start a transaction typically specifying REQUIRES_NEW or REQUIRED semantics.
|
static void |
commitTransaction()
Commit the current transaction.
|
static CallableSql |
createCallableSql(String sql)
Create a CallableSql to execute a given stored procedure.
|
static <T> CsvReader<T> |
createCsvReader(Class<T> beanType)
Create a CsvReader for a given beanType.
|
static <T> Query<T> |
createNamedQuery(Class<T> beanType,
String namedQuery)
Return a named Query that will have defined fetch paths, predicates etc.
|
static SqlQuery |
createNamedSqlQuery(String namedQuery)
Create a named sql query.
|
static SqlUpdate |
createNamedSqlUpdate(String namedQuery)
Create a named sql update.
|
static <T> Update<T> |
createNamedUpdate(Class<T> beanType,
String namedUpdate)
Create a named orm update.
|
static <T> Query<T> |
createQuery(Class<T> beanType)
Create a query for a type of entity bean.
|
static <T> Query<T> |
createQuery(Class<T> beanType,
String query)
Create a query using the query language.
|
static SqlQuery |
createSqlQuery(String sql)
Create a SqlQuery for executing native sql
query statements.
|
static SqlUpdate |
createSqlUpdate(String sql)
Create a sql update for executing native dml statements.
|
static <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).
|
static Transaction |
currentTransaction()
Returns the current transaction or null if there is no current transaction
in scope.
|
static int |
delete(Class<?> beanType,
Object id)
Delete the bean given its type and id.
|
static boolean |
delete(Object bean)
Delete the bean.
|
static void |
deleteAll(Class<?> beanType,
Collection<?> ids)
Delete several beans given their type and id values.
|
static int |
deleteAll(Collection<?> beans)
Delete all the beans in the Collection.
|
static int |
deleteAllPermanent(Collection<?> beans)
Delete permanent all the beans in the Collection (will not use soft delete).
|
static int |
deleteManyToManyAssociations(Object ownerBean,
String propertyName)
Delete the associations (from the intersection table) of a ManyToMany given
the owner bean and the propertyName of the ManyToMany collection.
|
static boolean |
deletePermanent(Object bean)
Delete the bean in permanent fashion (will not use soft delete).
|
static Map<String,ValuePair> |
diff(Object a,
Object b)
Return a map of the differences between two objects of the same type.
|
static void |
endTransaction()
If the current transaction has already been committed do nothing otherwise
rollback the transaction.
|
static int |
execute(CallableSql callableSql)
For making calls to stored procedures.
|
static int |
execute(SqlUpdate sqlUpdate)
Execute a Sql Update Delete or Insert statement.
|
static <T> T |
execute(TxCallable<T> c)
Execute a TxCallable in a Transaction with the default scope.
|
static void |
execute(TxRunnable r)
Execute a TxRunnable in a Transaction with the default scope.
|
static <T> T |
execute(TxScope scope,
TxCallable<T> c)
Execute a TxCallable in a Transaction with an explicit scope.
|
static void |
execute(TxScope scope,
TxRunnable r)
Execute a TxRunnable in a Transaction with an explicit scope.
|
static void |
externalModification(String tableName,
boolean inserts,
boolean updates,
boolean deletes)
Inform Ebean that tables have been modified externally.
|
static <T> Filter<T> |
filter(Class<T> beanType)
Create a filter for sorting and filtering lists of entities locally without
going back to the database.
|
static <T> Query<T> |
find(Class<T> beanType)
Create a query for a type of entity bean.
|
static <T> T |
find(Class<T> beanType,
Object id)
Find a bean using its unique id.
|
static BackgroundExecutor |
getBackgroundExecutor()
Return the BackgroundExecutor service for asynchronous processing of
queries.
|
static BeanState |
getBeanState(Object bean)
Return the BeanState for a given entity bean.
|
static EbeanServer |
getDefaultServer()
Returns the default EbeanServer.
|
static ExpressionFactory |
getExpressionFactory()
Return the ExpressionFactory from the default server.
|
static <T> T |
getReference(Class<T> beanType,
Object id)
Get a reference object.
|
static EbeanServer |
getServer(String name)
Get the EbeanServer for a given DataSource.
|
static ServerCacheManager |
getServerCacheManager()
Return the manager of the server cache ("L2" cache).
|
static void |
insert(Object bean)
Insert the bean.
|
static void |
insertAll(Collection<?> beans)
Insert a collection of beans.
|
static JsonContext |
json()
Return the JsonContext for reading/writing JSON.
|
static void |
markAsDirty(Object bean)
Marks the entity bean as dirty.
|
protected static EbeanServer |
mock(String name,
EbeanServer server,
boolean defaultServer)
Backdoor for registering a mock implementation of EbeanServer as the default server.
|
static Object |
nextId(Class<?> beanType)
Return the next identity value for a given bean type.
|
static void |
refresh(Object bean)
Refresh the values of a bean.
|
static void |
refreshMany(Object bean,
String manyPropertyName)
Refresh a 'many' property of a bean.
|
static void |
register(EbeanServer server,
boolean defaultServer)
Register the server with this Ebean singleton.
|
static void |
register(TransactionCallback transactionCallback)
Register a TransactionCallback on the currently active transaction.
|
static void |
rollbackTransaction()
Rollback the current transaction.
|
static void |
runCacheWarming()
Run the cache warming queries on all bean types that have one defined for
the default/primary EbeanServer.
|
static void |
runCacheWarming(Class<?> beanType)
Run the cache warming query for a specific bean type for the
default/primary EbeanServer.
|
static void |
save(Object bean)
Either Insert or Update the bean depending on its state.
|
static int |
saveAll(Collection<?> beans)
Save all the beans from a Collection.
|
static void |
saveAssociation(Object ownerBean,
String propertyName)
Save the associated collection or bean given the property name.
|
static void |
saveManyToManyAssociations(Object ownerBean,
String propertyName)
Save the associations of a ManyToMany given the owner bean and the
propertyName of the ManyToMany collection.
|
static <T> void |
sort(List<T> list,
String sortByClause)
Sort the list using the sortByClause which can contain a comma delimited
list of property names and keywords asc, desc, nullsHigh and nullsLow.
|
static void |
update(Object bean)
Saves the bean using an update.
|
static void |
updateAll(Collection<?> beans)
Update the beans in the collection.
|
public static EbeanServer getServer(String name)
This is provided to access EbeanServer for databases other than the 'default' database. EbeanServer also provides more control over transactions and the ability to use transactions created externally to Ebean.
// use the "hr" database
EbeanServer hrDatabase = Ebean.getServer("hr");
Person person = hrDatabase.find(Person.class, 10);
name - the name of the server, can use null for the 'default server'public static EbeanServer getDefaultServer()
This is equivalent to Ebean.getServer(null);
public static ExpressionFactory getExpressionFactory()
The ExpressionFactory is used internally by the query and ExpressionList to build the WHERE and HAVING clauses. Alternatively you can use the ExpressionFactory directly to create expressions to add to the query where clause.
Alternatively you can use the Expr as a shortcut to the
ExpressionFactory of the 'Default' EbeanServer.
You generally need to the an ExpressionFactory (or Expr) to build
an expression that uses OR like Expression e = Expr.or(..., ...);
public static void register(EbeanServer server, boolean defaultServer)
protected static EbeanServer mock(String name, EbeanServer server, boolean defaultServer)
public static Object nextId(Class<?> beanType)
This will only work when a IdGenerator is on this bean type such as 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.
public static 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)
Ebean.beginTransaction();
try {
Order order = Ebean.find(Order.class,10); ...
Ebean.save(order);
Ebean.commitTransaction();
} finally {
// rollback if we didn't commit
// i.e. an exception occurred before commitTransaction().
Ebean.endTransaction();
}
If you want to externalise the transaction management then you should be able to do this via EbeanServer. Specifically with EbeanServer you can pass the transaction to the various find() and save() execute() methods. This gives you the ability to create the transactions yourself externally from Ebean and pass those transactions through to the various methods available on EbeanServer.
public static Transaction beginTransaction(TxIsolation isolation)
isolation - the Transaction isolation levelpublic static Transaction beginTransaction(TxScope scope)
Note that this provides an try finally alternative to using execute(TxScope, TxCallable) or
execute(TxScope, TxRunnable).
// Start a new transaction. If there is a current transaction
// suspend it until this transaction ends
Transaction txn = Ebean.beginTransaction(TxScope.requiresNew());
try {
...
// commit the transaction
txn.commit();
} finally {
// end this transaction which:
// A) will rollback transaction if it has not been committed already
// B) will restore a previously suspended transaction
txn.end();
}
// start a new transaction if there is not a current transaction
Transaction txn = Ebean.beginTransaction(TxScope.required());
try {
...
// commit the transaction if it was created or
// do nothing if there was already a current transaction
txn.commit();
} finally {
// end this transaction which will rollback the transaction
// if it was created for this try finally scope and has not
// already been committed
txn.end();
}
public static Transaction currentTransaction()
public static void register(TransactionCallback transactionCallback) throws javax.persistence.PersistenceException
transactionCallback - the transaction callback to be registered with the current transactionjavax.persistence.PersistenceException - if there is no currently active transactionpublic static void commitTransaction()
public static void rollbackTransaction()
public static 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:
Ebean.beginTransaction();
try {
// do some fetching and or persisting
// commit at the end
Ebean.commitTransaction();
} finally {
// if commit didn't occur then rollback the transaction
Ebean.endTransaction();
}
public static Map<String,ValuePair> diff(Object a, Object b)
When null is passed in for b, then the 'OldValues' of a is used for the difference comparison.
public static 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.OptimisticLockExceptionpublic static void insert(Object bean)
public static void insertAll(Collection<?> beans)
public static void markAsDirty(Object bean) throws javax.persistence.OptimisticLockException
This is used so that when a bean that is otherwise unmodified is updated with the version property 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 = Ebean.find(Customer, id);
// mark the bean as dirty so that a save() or update() will
// increment the version property
Ebean.markAsDirty(customer);
Ebean.save(customer);
javax.persistence.OptimisticLockExceptionpublic static 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.OptimisticLockExceptionServerConfig.setUpdatesDeleteMissingChildren(boolean),
ServerConfig.setUpdateChangesOnly(boolean)public static void updateAll(Collection<?> beans) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockExceptionpublic static int saveAll(Collection<?> beans) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockExceptionpublic static int deleteManyToManyAssociations(Object ownerBean, String propertyName)
Typically these deletions occur automatically when persisting a ManyToMany collection and this provides a way to invoke those deletions directly.
public static void saveManyToManyAssociations(Object ownerBean, String propertyName)
Typically the saving of these associations (inserting into the intersection table) occurs automatically when persisting a ManyToMany. This provides a way to invoke those insertions directly.
You can use this when the collection is new and in this case all the entries in the collection are treated as additions are result in inserts into the intersection table.
public static void saveAssociation(Object ownerBean, String propertyName)
This is similar to performing a save cascade on a specific property manually/programmatically.
Note that you can turn on/off cascading for a transaction via
Transaction.setPersistCascade(boolean)
ownerBean - the bean instance holding the property we want to savepropertyName - the property we want to savepublic static 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 is configured with @SoftDelete then this will perform a soft
delete rather than a hard/permanent delete.
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.OptimisticLockExceptionpublic static boolean deletePermanent(Object bean) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockExceptionpublic static int delete(Class<?> beanType, Object id)
public static void deleteAll(Class<?> beanType, Collection<?> ids)
public static int deleteAll(Collection<?> beans) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockExceptionpublic static int deleteAllPermanent(Collection<?> beans) throws javax.persistence.OptimisticLockException
javax.persistence.OptimisticLockExceptionpublic static 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.
public static void refreshMany(Object bean, String manyPropertyName)
Order order = ...;
...
// refresh the order details...
Ebean.refreshMany(order, "details");
bean - the entity bean containing the List Set or Map to refresh.manyPropertyName - the property name of the List Set or Map to refresh.public static <T> T getReference(Class<T> beanType, Object id)
This is sometimes described as a proxy (with lazy loading).
Product product = Ebean.getReference(Product.class, 1);
// You can get the id without causing a fetch/lazy load
Integer 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 valuepublic static <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 = Ebean.find(Order.class)
.fetch("customer")
.orderBy("id")
.findList();
// sort by customer name ascending, then by order shipDate
// ... then by the order status descending
Ebean.sort(list, "customer.name, shipDate, status desc");
// sort by customer name descending (with nulls low)
// ... then by the order id
Ebean.sort(list, "customer.name desc nullsLow, id");
list - the list of entity beanssortByClause - the properties to sort the list by@Nullable public static <T> T find(Class<T> beanType, Object id)
// Fetch order 1
Order order = Ebean.find(Order.class, 1);
If you want more control over the query then you can use createQuery() and Query.findUnique();
// ... 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 = Ebean.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");
// traverse the object graph...
Order order = query.findUnique();
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 valuepublic static SqlQuery createSqlQuery(String sql)
Note that you can use raw SQL with entity beans, refer to the SqlSelect annotation for examples.
public static SqlQuery createNamedSqlQuery(String namedQuery)
The query statement will be defined in a deployment orm xml file.
namedQuery - the name of the querypublic static 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.
Where possible it would be expected practice to put the statement in a orm
xml file (named update) and use createNamedSqlUpdate(String) .
public static CallableSql createCallableSql(String sql)
CallableSqlpublic static SqlUpdate createNamedSqlUpdate(String namedQuery)
The statement (an Insert Update or Delete statement) will be defined in a deployment orm xml file.
// Use a namedQuery
UpdateSql update = Ebean.createNamedSqlUpdate("update.topic.count");
update.setParameter("count", 1);
update.setParameter("topicId", 50);
int modifiedCount = update.execute();
public static <T> Query<T> createNamedQuery(Class<T> beanType, String namedQuery)
The query is created from a statement that will be defined in a deployment orm xml file or NamedQuery annotations. The query will typically already define fetch paths, predicates, order by clauses etc so often you will just need to bind required parameters and then execute the query.
// example
Query<Order> query = Ebean.createNamedQuery(Order.class, "new.for.customer");
query.setParameter("customerId", 23);
List<Order> newOrders = query.findList();
beanType - the class of entity to be fetchednamedQuery - the name of the querypublic static <T> Query<T> createQuery(Class<T> beanType, String query)
Note that you are allowed to add additional clauses using where() as well as use fetch() and setOrderBy() after the query has been created.
Note that this method signature used to map to named queries and that has
moved to createNamedQuery(Class, String).
String q = "find order fetch details where status = :st";
List<Order> newOrders = Ebean.>findOrder.class, q)
.setParameter("st", Order.Status.NEW)
.findList();
query - the object querypublic static <T> Update<T> createNamedUpdate(Class<T> beanType, String namedUpdate)
The orm update differs from the SqlUpdate in that it uses the bean name and bean property names rather than table and column names.
Note that named update statements can be specified in raw sql (with column and table names) or using bean name and bean property names. This can be specified with the isSql flag.
Example named updates:
package app.data;
import ...
@NamedUpdates(value = {
@NamedUpdate( name = "setTitle",
isSql = false,
notifyCache = false,
update = "update topic set title = :title, postCount = :postCount where id = :id"),
@NamedUpdate( name = "setPostCount",
notifyCache = false,
update = "update f_topic set post_count = :postCount where id = :id"),
@NamedUpdate( name = "incrementPostCount",
notifyCache = false,
isSql = false,
update = "update Topic set postCount = postCount + 1 where id = :id") })
@Entity
@Table(name = "f_topic")
public class Topic { ...
Example using a named update:
Update<Topic> update = Ebean.createNamedUpdate(Topic.class, "setPostCount");
update.setParameter("postCount", 10);
update.setParameter("id", 3);
int rows = update.execute();
System.out.println("rows updated: " + rows);
public static <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 = Ebean.createUpdate(Topic.class, updStatement);
update.set("pc", 9);
update.set("id", 3);
int rows = update.execute();
System.out.println("rows updated:" + rows);
public static <T> CsvReader<T> createCsvReader(Class<T> beanType)
public static <T> Query<T> createQuery(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 findUnique() 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 additionally fetching the customer, details and details.product
// name.
Order order = Ebean.find(Order.class)
.fetch("customer")
.fetch("details")
.fetch("detail.product", "name")
.setId(2)
.findUnique();
// Find order 2 additionally fetching the customer, details and details.product
// name.
// Note: same query as above but using the query language
// Note: using a named query would be preferred practice
String oql = "find order fetch customer fetch details fetch details.product (name) where id = :orderId ";
Query<Order> query = Ebean.find(Order.class);
query.setQuery(oql);
query.setParameter("orderId", 2);
Order order = query.findUnique();
// Using a named query
Query<Order> query = Ebean.find(Order.class, "with.details");
query.setParameter("orderId", 2);
Order order = query.findUnique();
beanType - the class of entity to be fetchedpublic static <T> Query<T> find(Class<T> beanType)
This is actually the same as createQuery(Class). The reason it
exists is that people used to JPA will probably be looking for a
createQuery method (the same as entityManager).
beanType - the type of entity bean to findpublic static <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.
public static int execute(SqlUpdate sqlUpdate)
If you wish to execute a Sql Select natively then you should use the FindByNativeSql object.
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 = Ebean.createSqlUpdate(s);
update.setParameter("id", 1);
update.setParameter("count", 50);
int modifiedCount = Ebean.execute(update);
String msg = "There where " + modifiedCount + "rows updated";
sqlUpdate - the update sql potentially with bind valuesSqlUpdate,
CallableSql,
execute(CallableSql)public static int execute(CallableSql callableSql)
Example:
String sql = "{call sp_order_modify(?,?,?)}";
CallableSql cs = Ebean.createCallableSql(sql);
cs.setParameter(1, 27);
cs.setParameter(2, "SHIPPED");
cs.registerOut(3, Types.INTEGER);
Ebean.execute(cs);
// read the out parameter
Integer returnValue = (Integer) cs.getObject(3);
CallableSql,
execute(SqlUpdate)public static void execute(TxScope scope, TxRunnable r)
The scope can control the transaction type, isolation and rollback semantics.
// set specific transactional scope settings
TxScope scope = TxScope.requiresNew().setIsolation(TxIsolation.SERIALIZABLE);
Ebean.execute(scope, new TxRunnable() {
public void run() {
User u1 = Ebean.find(User.class, 1);
...
}
});
public static void execute(TxRunnable r)
The default scope runs with REQUIRED and by default will rollback on any exception (checked or runtime).
Ebean.execute(new TxRunnable() {
public void run() {
User u1 = Ebean.find(User.class, 1);
User u2 = Ebean.find(User.class, 2);
u1.setName("u1 mod");
u2.setName("u2 mod");
Ebean.save(u1);
Ebean.save(u2);
}
});
public static <T> T execute(TxScope scope, TxCallable<T> c)
The scope can control the transaction type, isolation and rollback semantics.
// set specific transactional scope settings
TxScope scope = TxScope.requiresNew().setIsolation(TxIsolation.SERIALIZABLE);
Ebean.execute(scope, new TxCallable<String>() {
public String call() {
User u1 = Ebean.find(User.class, 1);
...
return u1.getEmail();
}
});
public static <T> T execute(TxCallable<T> c)
The default scope runs with REQUIRED and by default will rollback on any exception (checked or runtime).
This is basically the same as TxRunnable except that it returns an Object (and you specify the return type via generics).
Ebean.execute(new TxCallable<String>() {
public String call() {
User u1 = Ebean.find(User.class, 1);
User u2 = Ebean.find(User.class, 2);
u1.setName("u1 mod");
u2.setName("u2 mod");
Ebean.save(u1);
Ebean.save(u2);
return u1.getEmail();
}
});
public static void externalModification(String tableName, boolean inserts, boolean updates, boolean deletes)
If you use Ebean.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 modifiedinserts - true if rows where inserted into the tableupdates - true if rows on the table where updateddeletes - true if rows on the table where deletedpublic static BeanState getBeanState(Object bean)
This will return null if the bean is not an enhanced entity bean.
public static ServerCacheManager getServerCacheManager()
public static BackgroundExecutor getBackgroundExecutor()
public static void runCacheWarming()
A cache warming query can be defined via CacheStrategy.
public static void runCacheWarming(Class<?> beanType)
A cache warming query can be defined via CacheStrategy.
public static JsonContext json()
Copyright © 2016. All rights reserved.