diff --git a/src/main/java/io/ebean/DatabaseFactory.java b/src/main/java/io/ebean/DatabaseFactory.java index bde3dfc10..108ababc1 100644 --- a/src/main/java/io/ebean/DatabaseFactory.java +++ b/src/main/java/io/ebean/DatabaseFactory.java @@ -2,6 +2,13 @@ package io.ebean; import io.ebean.config.ContainerConfig; import io.ebean.config.DatabaseConfig; +import io.ebean.service.SpiContainer; +import io.ebean.service.SpiContainerFactory; + +import javax.persistence.PersistenceException; +import java.util.Iterator; +import java.util.Properties; +import java.util.ServiceLoader; /** * Creates Database instances. @@ -23,6 +30,12 @@ import io.ebean.config.DatabaseConfig; */ public class DatabaseFactory { + private static SpiContainer container; + + static { + EbeanVersion.getVersion(); + } + /** * Initialise the container with clustering configuration. *
@@ -30,28 +43,44 @@ public class DatabaseFactory { * ContainerConfig on the ServerConfig when creating the first Database instance. */ public static synchronized void initialiseContainer(ContainerConfig containerConfig) { - EbeanServerFactory.initialiseContainer(containerConfig); + getContainer(containerConfig); } /** - * Create using ebean.properties to configure the database. + * Create using properties to configure the database. */ public static synchronized Database create(String name) { - return EbeanServerFactory.create(name); + // construct based on loading properties files + return getContainer(null).createServer(name); } /** - * Create using the ServerConfig object to configure the database. + * Create using the DatabaseConfig object to configure the database. */ public static synchronized Database create(DatabaseConfig config) { - return EbeanServerFactory.create(config); + if (config.getName() == null) { + throw new PersistenceException("The name is null (it is required)"); + } + Database server = createInternal(config); + if (config.isRegister()) { + DbPrimary.setSkip(true); + DbContext.getInstance().register(server, config.isDefaultServer()); + } + return server; } /** - * Create using the ServerConfig additionally specifying a classLoader to use as the context class loader. + * Create using the DatabaseConfig additionally specifying a classLoader to use as the context class loader. */ public static synchronized Database createWithContextClassLoader(DatabaseConfig config, ClassLoader classLoader) { - return EbeanServerFactory.createWithContextClassLoader(config, classLoader); + ClassLoader currentContextLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(classLoader); + try { + return DatabaseFactory.create(config); + } finally { + // set the currentContextLoader back + Thread.currentThread().setContextClassLoader(currentContextLoader); + } } /** @@ -61,7 +90,44 @@ public class DatabaseFactory { *
*/ public static synchronized void shutdown() { - EbeanServerFactory.shutdown(); + container.shutdown(); } + private static Database createInternal(DatabaseConfig config) { + return getContainer(config.getContainerConfig()).createServer(config); + } + + /** + * Get the EbeanContainer initialising it if necessary. + * + * @param containerConfig the configuration controlling clustering communication + */ + private static SpiContainer getContainer(ContainerConfig containerConfig) { + + // thread safe in that all calling methods are synchronized + if (container != null) { + return container; + } + + if (containerConfig == null) { + // effectively load configuration from ebean.properties + Properties properties = DbPrimary.getProperties(); + containerConfig = new ContainerConfig(); + containerConfig.loadFromProperties(properties); + } + container = createContainer(containerConfig); + return container; + } + + /** + * Create the container instance using the configuration. + */ + protected static SpiContainer createContainer(ContainerConfig containerConfig) { + + Iterator@@ -47,53 +40,28 @@ public class EbeanServerFactory { * ContainerConfig on the ServerConfig when creating the first EbeanServer instance. */ public static synchronized void initialiseContainer(ContainerConfig containerConfig) { - getContainer(containerConfig); + DatabaseFactory.initialiseContainer(containerConfig); } /** * Create using ebean.properties to configure the database. */ public static synchronized EbeanServer create(String name) { - - // construct based on loading properties files - // and if invoked by Ebean then it handles registration - SpiContainer serverFactory = getContainer(null); - return serverFactory.createServer(name); + return (EbeanServer)DatabaseFactory.create(name); } /** * Create using the ServerConfig object to configure the database. */ public static synchronized EbeanServer create(ServerConfig config) { - - if (config.getName() == null) { - throw new PersistenceException("The name is null (it is required)"); - } - - EbeanServer server = createInternal(config); - - if (config.isRegister()) { - DbPrimary.setSkip(true); - Ebean.register(server, config.isDefaultServer()); - } - - return server; + return (EbeanServer)DatabaseFactory.create(config); } /** * Create using the ServerConfig additionally specifying a classLoader to use as the context class loader. */ public static synchronized EbeanServer createWithContextClassLoader(ServerConfig config, ClassLoader classLoader) { - - ClassLoader currentContextLoader = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(classLoader); - try { - return EbeanServerFactory.create(config); - - } finally { - // set the currentContextLoader back - Thread.currentThread().setContextClassLoader(currentContextLoader); - } + return (EbeanServer)DatabaseFactory.createWithContextClassLoader(config, classLoader); } /** @@ -103,46 +71,7 @@ public class EbeanServerFactory { *
*/ public static synchronized void shutdown() { - container.shutdown(); + DatabaseFactory.shutdown(); } - - private static EbeanServer createInternal(ServerConfig config) { - - return getContainer(config.getContainerConfig()).createServer(config); - } - - /** - * Get the EbeanContainer initialising it if necessary. - * - * @param containerConfig the configuration controlling clustering communication - */ - private static SpiContainer getContainer(ContainerConfig containerConfig) { - - // thread safe in that all calling methods are synchronized - if (container != null) { - return container; - } - - if (containerConfig == null) { - // effectively load configuration from ebean.properties - Properties properties = DbPrimary.getProperties(); - containerConfig = new ContainerConfig(); - containerConfig.loadFromProperties(properties); - } - container = createContainer(containerConfig); - return container; - } - - /** - * Create the container instance using the configuration. - */ - protected static SpiContainer createContainer(ContainerConfig containerConfig) { - - Iterator
+ * NB: ModuleInfoLoader implementations are generated by querybean generator.
+ * Having this on and registering entity classes means we don't need to manually
+ * write that code or use classpath scanning to find entity classes.
+ */
+ private boolean loadModuleInfo = true;
+
+ /**
+ * List of interesting classes such as entities, embedded, ScalarTypes,
+ * Listeners, Finders, Controllers etc.
+ */
+ private List
+ * autoReadOnlyDataSource is an unfortunate name for this config option but I haven't come up with a better one.
+ */
+ private boolean autoReadOnlyDataSource;
+
+ /**
+ * Optional configuration for a read only data source.
+ */
+ private DataSourceConfig readOnlyDataSourceConfig = new DataSourceConfig();
+
+ /**
+ * Optional - the database schema that should be used to own the tables etc.
+ */
+ private String dbSchema;
+
+ /**
+ * The db migration config (migration resource path etc).
+ */
+ private DbMigrationConfig migrationConfig = new DbMigrationConfig();
+
+ /**
+ * The ClassLoadConfig used to detect Joda, Java8, Jackson etc and create plugin instances given a className.
+ */
+ private ClassLoadConfig classLoadConfig = new ClassLoadConfig();
+
+ /**
+ * The data source JNDI name if using a JNDI DataSource.
+ */
+ private String dataSourceJndiName;
+
+ /**
+ * The naming convention.
+ */
+ private NamingConvention namingConvention = new UnderscoreNamingConvention();
+
+ /**
+ * Behaviour of updates in JDBC batch to by default include all properties.
+ */
+ private boolean updateAllPropertiesInBatch;
+
+ /**
+ * Database platform configuration.
+ */
+ private PlatformConfig platformConfig = new PlatformConfig();
+
+ /**
+ * The UUID version to use.
+ */
+ private UuidVersion uuidVersion = UuidVersion.VERSION4;
+
+ /**
+ * The UUID state file (for Version 1 UUIDs). By default, the file is created in
+ * ${HOME}/.ebean/${servername}-uuid.state
+ */
+ private String uuidStateFile;
+
+ /**
+ * The clock used for setting the timestamps (e.g. @UpdatedTimestamp) on objects.
+ */
+ private Clock clock = Clock.systemUTC();
+
+ private List
+ * For example, put IgniteConfiguration in to be passed to the Ignite plugin.
+ */
+ public void putServiceObject(String key, Object configObject) {
+ serviceObject.put(key, configObject);
+ }
+
+ /**
+ * Return the service object given the key.
+ */
+ public Object getServiceObject(String key) {
+ return serviceObject.get(key);
+ }
+
+ /**
+ * Put a service object into configuration such that it can be passed to a plugin.
+ *
+ * P getServiceObject(Class cls) {
+ return (P) serviceObject.get(serviceObjectKey(cls));
+ }
+
+ /**
+ * Return the Jackson JsonFactory to use.
+ *
+ * If not set a default implementation will be used.
+ */
+ public JsonFactory getJsonFactory() {
+ return jsonFactory;
+ }
+
+ /**
+ * Set the Jackson JsonFactory to use.
+ *
+ * If not set a default implementation will be used.
+ */
+ public void setJsonFactory(JsonFactory jsonFactory) {
+ this.jsonFactory = jsonFactory;
+ }
+
+ /**
+ * Return the JSON format used for DateTime types.
+ */
+ public JsonConfig.DateTime getJsonDateTime() {
+ return jsonDateTime;
+ }
+
+ /**
+ * Set the JSON format to use for DateTime types.
+ */
+ public void setJsonDateTime(JsonConfig.DateTime jsonDateTime) {
+ this.jsonDateTime = jsonDateTime;
+ }
+
+ /**
+ * Return the JSON format used for Date types.
+ */
+ public JsonConfig.Date getJsonDate() {
+ return jsonDate;
+ }
+
+ /**
+ * Set the JSON format to use for Date types.
+ */
+ public void setJsonDate(JsonConfig.Date jsonDate) {
+ this.jsonDate = jsonDate;
+ }
+
+ /**
+ * Return the JSON include mode used when writing JSON.
+ */
+ public JsonConfig.Include getJsonInclude() {
+ return jsonInclude;
+ }
+
+ /**
+ * Set the JSON include mode used when writing JSON.
+ *
+ * Set to NON_NULL or NON_EMPTY to suppress nulls or null and empty collections respectively.
+ */
+ public void setJsonInclude(JsonConfig.Include jsonInclude) {
+ this.jsonInclude = jsonInclude;
+ }
+
+ /**
+ * Return the name of the Database.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the name of the Database.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Return the container / clustering configuration.
+ *
+ * By default this is set to true.
+ */
+ public boolean isRegister() {
+ return register;
+ }
+
+ /**
+ * Set to false if you do not want this server to be registered with the Ebean
+ * singleton when it is created.
+ *
+ * By default this is set to true.
+ */
+ public void setRegister(boolean register) {
+ this.register = register;
+ }
+
+ /**
+ * Return true if this server should be registered as the "default" server
+ * with the Ebean singleton.
+ *
+ * This is only used when {@link #setRegister(boolean)} is also true.
+ */
+ public boolean isDefaultServer() {
+ return defaultServer;
+ }
+
+ /**
+ * Set false if you do not want this Database to be registered as the "default" database
+ * with the DB singleton.
+ *
+ * This is only used when {@link #setRegister(boolean)} is also true.
+ */
+ public void setDefaultServer(boolean defaultServer) {
+ this.defaultServer = defaultServer;
+ }
+
+ /**
+ * Return the CurrentUserProvider. This is used to populate @WhoCreated, @WhoModified and
+ * support other audit features (who executed a query etc).
+ */
+ public CurrentUserProvider getCurrentUserProvider() {
+ return currentUserProvider;
+ }
+
+ /**
+ * Set the CurrentUserProvider. This is used to populate @WhoCreated, @WhoModified and
+ * support other audit features (who executed a query etc).
+ */
+ public void setCurrentUserProvider(CurrentUserProvider currentUserProvider) {
+ this.currentUserProvider = currentUserProvider;
+ }
+
+ /**
+ * Return the tenancy mode used.
+ */
+ public TenantMode getTenantMode() {
+ return tenantMode;
+ }
+
+ /**
+ * Set the tenancy mode to use.
+ */
+ public void setTenantMode(TenantMode tenantMode) {
+ this.tenantMode = tenantMode;
+ }
+
+ /**
+ * Return the column name used for TenantMode.PARTITION.
+ */
+ public String getTenantPartitionColumn() {
+ return tenantPartitionColumn;
+ }
+
+ /**
+ * Set the column name used for TenantMode.PARTITION.
+ */
+ public void setTenantPartitionColumn(String tenantPartitionColumn) {
+ this.tenantPartitionColumn = tenantPartitionColumn;
+ }
+
+ /**
+ * Return the current tenant provider.
+ */
+ public CurrentTenantProvider getCurrentTenantProvider() {
+ return currentTenantProvider;
+ }
+
+ /**
+ * Set the current tenant provider.
+ */
+ public void setCurrentTenantProvider(CurrentTenantProvider currentTenantProvider) {
+ this.currentTenantProvider = currentTenantProvider;
+ }
+
+ /**
+ * Return the tenancy datasource provider.
+ */
+ public TenantDataSourceProvider getTenantDataSourceProvider() {
+ return tenantDataSourceProvider;
+ }
+
+ /**
+ * Set the tenancy datasource provider.
+ */
+ public void setTenantDataSourceProvider(TenantDataSourceProvider tenantDataSourceProvider) {
+ this.tenantDataSourceProvider = tenantDataSourceProvider;
+ }
+
+ /**
+ * Return the tenancy schema provider.
+ */
+ public TenantSchemaProvider getTenantSchemaProvider() {
+ return tenantSchemaProvider;
+ }
+
+ /**
+ * Set the tenancy schema provider.
+ */
+ public void setTenantSchemaProvider(TenantSchemaProvider tenantSchemaProvider) {
+ this.tenantSchemaProvider = tenantSchemaProvider;
+ }
+
+ /**
+ * Return the tenancy catalog provider.
+ */
+ public TenantCatalogProvider getTenantCatalogProvider() {
+ return tenantCatalogProvider;
+ }
+
+ /**
+ * Set the tenancy catalog provider.
+ */
+ public void setTenantCatalogProvider(TenantCatalogProvider tenantCatalogProvider) {
+ this.tenantCatalogProvider = tenantCatalogProvider;
+ }
+
+ /**
+ * Return the PersistBatch mode to use by default at the transaction level.
+ *
+ * When INSERT or ALL is used then save(), delete() etc do not execute immediately but instead go into
+ * a JDBC batch execute buffer that is flushed. The buffer is flushed if a query is executed, transaction ends
+ * or the batch size is meet.
+ */
+ public PersistBatch getPersistBatch() {
+ return persistBatch;
+ }
+
+ /**
+ * Set the JDBC batch mode to use at the transaction level.
+ *
+ * When INSERT or ALL is used then save(), delete() etc do not execute immediately but instead go into
+ * a JDBC batch execute buffer that is flushed. The buffer is flushed if a query is executed, transaction ends
+ * or the batch size is meet.
+ */
+ public void setPersistBatch(PersistBatch persistBatch) {
+ this.persistBatch = persistBatch;
+ }
+
+ /**
+ * Return the JDBC batch mode to use per save(), delete(), insert() or update() request.
+ *
+ * This makes sense when a save() or delete() cascades and executes multiple child statements. The best case
+ * for this is when saving a master/parent bean this cascade inserts many detail/child beans.
+ *
+ * This only takes effect when the persistBatch mode at the transaction level does not take effect.
+ */
+ public PersistBatch getPersistBatchOnCascade() {
+ return persistBatchOnCascade;
+ }
+
+ /**
+ * Set the JDBC batch mode to use per save(), delete(), insert() or update() request.
+ *
+ * This makes sense when a save() or delete() etc cascades and executes multiple child statements. The best caase
+ * for this is when saving a master/parent bean this cascade inserts many detail/child beans.
+ *
+ * This only takes effect when the persistBatch mode at the transaction level does not take effect.
+ */
+ public void setPersistBatchOnCascade(PersistBatch persistBatchOnCascade) {
+ this.persistBatchOnCascade = persistBatchOnCascade;
+ }
+
+ /**
+ * Deprecated, please migrate to using setPersistBatch().
+ *
+ * Set to true if you what to use JDBC batching for persisting and deleting beans.
+ *
+ * With this Ebean will batch up persist requests and use the JDBC batch api.
+ * This is a performance optimisation designed to reduce the network chatter.
+ *
+ * When true this is equivalent to {@code setPersistBatch(PersistBatch.ALL)} or
+ * when false to {@code setPersistBatch(PersistBatch.NONE)}
+ */
+ public void setPersistBatching(boolean persistBatching) {
+ this.persistBatch = (persistBatching) ? PersistBatch.ALL : PersistBatch.NONE;
+ }
+
+ /**
+ * Return the batch size used for JDBC batching. This defaults to 20.
+ */
+ public int getPersistBatchSize() {
+ return persistBatchSize;
+ }
+
+ /**
+ * Set the batch size used for JDBC batching. If unset this defaults to 20.
+ *
+ * You can also set the batch size on the transaction.
+ *
+ * @see Transaction#setBatchSize(int)
+ */
+ public void setPersistBatchSize(int persistBatchSize) {
+ this.persistBatchSize = persistBatchSize;
+ }
+
+ /**
+ * Gets the query batch size. This defaults to 100.
+ *
+ * @return the query batch size
+ */
+ public int getQueryBatchSize() {
+ return queryBatchSize;
+ }
+
+ /**
+ * Sets the query batch size. This defaults to 100.
+ *
+ * @param queryBatchSize the new query batch size
+ */
+ public void setQueryBatchSize(int queryBatchSize) {
+ this.queryBatchSize = queryBatchSize;
+ }
+
+ public EnumType getDefaultEnumType() {
+ return defaultEnumType;
+ }
+
+ public void setDefaultEnumType(EnumType defaultEnumType) {
+ this.defaultEnumType = defaultEnumType;
+ }
+
+ /**
+ * Return true if lazy loading is disabled on queries by default.
+ */
+ public boolean isDisableLazyLoading() {
+ return disableLazyLoading;
+ }
+
+ /**
+ * Set to true to disable lazy loading by default.
+ *
+ * It can be turned on per query via {@link Query#setDisableLazyLoading(boolean)}.
+ */
+ public void setDisableLazyLoading(boolean disableLazyLoading) {
+ this.disableLazyLoading = disableLazyLoading;
+ }
+
+ /**
+ * Return the default batch size for lazy loading of beans and collections.
+ */
+ public int getLazyLoadBatchSize() {
+ return lazyLoadBatchSize;
+ }
+
+ /**
+ * Set the default batch size for lazy loading.
+ *
+ * This is the number of beans or collections loaded when lazy loading is
+ * invoked by default.
+ *
+ * The default value is for this is 10 (load 10 beans or collections).
+ *
+ * You can explicitly control the lazy loading batch size for a given join on
+ * a query using +lazy(batchSize) or JoinConfig.
+ */
+ public void setLazyLoadBatchSize(int lazyLoadBatchSize) {
+ this.lazyLoadBatchSize = lazyLoadBatchSize;
+ }
+
+ /**
+ * Set the number of sequences to fetch/preallocate when using DB sequences.
+ *
+ * This is a performance optimisation to reduce the number times Ebean
+ * requests a sequence to be used as an Id for a bean (aka reduce network
+ * chatter).
+
+ */
+ public void setDatabaseSequenceBatchSize(int databaseSequenceBatchSize) {
+ platformConfig.setDatabaseSequenceBatchSize(databaseSequenceBatchSize);
+ }
+
+ /**
+ * Return the default JDBC fetchSize hint for findList queries.
+ */
+ public int getJdbcFetchSizeFindList() {
+ return jdbcFetchSizeFindList;
+ }
+
+ /**
+ * Set the default JDBC fetchSize hint for findList queries.
+ */
+ public void setJdbcFetchSizeFindList(int jdbcFetchSizeFindList) {
+ this.jdbcFetchSizeFindList = jdbcFetchSizeFindList;
+ }
+
+ /**
+ * Return the default JDBC fetchSize hint for findEach/findEachWhile queries.
+ */
+ public int getJdbcFetchSizeFindEach() {
+ return jdbcFetchSizeFindEach;
+ }
+
+ /**
+ * Set the default JDBC fetchSize hint for findEach/findEachWhile queries.
+ */
+ public void setJdbcFetchSizeFindEach(int jdbcFetchSizeFindEach) {
+ this.jdbcFetchSizeFindEach = jdbcFetchSizeFindEach;
+ }
+
+ /**
+ * Return the ChangeLogPrepare.
+ *
+ * This is used to set user context information to the ChangeSet in the
+ * foreground thread prior to the logging occurring in a background thread.
+ */
+ public ChangeLogPrepare getChangeLogPrepare() {
+ return changeLogPrepare;
+ }
+
+ /**
+ * Set the ChangeLogPrepare.
+ *
+ * This is used to set user context information to the ChangeSet in the
+ * foreground thread prior to the logging occurring in a background thread.
+ */
+ public void setChangeLogPrepare(ChangeLogPrepare changeLogPrepare) {
+ this.changeLogPrepare = changeLogPrepare;
+ }
+
+ /**
+ * Return the ChangeLogListener which actually performs the logging of change sets
+ * in the background.
+ */
+ public ChangeLogListener getChangeLogListener() {
+ return changeLogListener;
+ }
+
+ /**
+ * Set the ChangeLogListener which actually performs the logging of change sets
+ * in the background.
+ */
+ public void setChangeLogListener(ChangeLogListener changeLogListener) {
+ this.changeLogListener = changeLogListener;
+ }
+
+ /**
+ * Return the ChangeLogRegister which controls which ChangeLogFilter is used for each
+ * bean type and in this way provide fine grained control over which persist requests
+ * are included in the change log.
+ */
+ public ChangeLogRegister getChangeLogRegister() {
+ return changeLogRegister;
+ }
+
+ /**
+ * Set the ChangeLogRegister which controls which ChangeLogFilter is used for each
+ * bean type and in this way provide fine grained control over which persist requests
+ * are included in the change log.
+ */
+ public void setChangeLogRegister(ChangeLogRegister changeLogRegister) {
+ this.changeLogRegister = changeLogRegister;
+ }
+
+ /**
+ * Return true if inserts should be included in the change log by default.
+ */
+ public boolean isChangeLogIncludeInserts() {
+ return changeLogIncludeInserts;
+ }
+
+ /**
+ * Set if inserts should be included in the change log by default.
+ */
+ public void setChangeLogIncludeInserts(boolean changeLogIncludeInserts) {
+ this.changeLogIncludeInserts = changeLogIncludeInserts;
+ }
+
+ /**
+ * Return true (default) if the changelog should be written async.
+ */
+ public boolean isChangeLogAsync() {
+ return changeLogAsync;
+ }
+
+ /**
+ * Sets if the changelog should be written async (default = true).
+ */
+ public void setChangeLogAsync(boolean changeLogAsync) {
+ this.changeLogAsync = changeLogAsync;
+ }
+
+ /**
+ * Return the ReadAuditLogger to use.
+ */
+ public ReadAuditLogger getReadAuditLogger() {
+ return readAuditLogger;
+ }
+
+ /**
+ * Set the ReadAuditLogger to use. If not set the default implementation is used
+ * which logs the read events in JSON format to a standard named SLF4J logger
+ * (which can be configured in say logback to log to a separate log file).
+ */
+ public void setReadAuditLogger(ReadAuditLogger readAuditLogger) {
+ this.readAuditLogger = readAuditLogger;
+ }
+
+ /**
+ * Return the ReadAuditPrepare to use.
+ */
+ public ReadAuditPrepare getReadAuditPrepare() {
+ return readAuditPrepare;
+ }
+
+ /**
+ * Set the ReadAuditPrepare to use.
+ *
+ * It is expected that an implementation is used that read user context information
+ * (user id, user ip address etc) and sets it on the ReadEvent bean before it is sent
+ * to the ReadAuditLogger.
+ */
+ public void setReadAuditPrepare(ReadAuditPrepare readAuditPrepare) {
+ this.readAuditPrepare = readAuditPrepare;
+ }
+
+ /**
+ * Return the configuration for profiling.
+ */
+ public ProfilingConfig getProfilingConfig() {
+ return profilingConfig;
+ }
+
+ /**
+ * Set the configuration for profiling.
+ */
+ public void setProfilingConfig(ProfilingConfig profilingConfig) {
+ this.profilingConfig = profilingConfig;
+ }
+
+ /**
+ * Return the DB schema to use.
+ */
+ public String getDbSchema() {
+ return dbSchema;
+ }
+
+ /**
+ * Set the DB schema to use. This specifies to use this schema for:
+ *
+ * When set a Calendar object is used in JDBC calls when reading/writing Timestamp objects.
+ */
+ public String getDataTimeZone() {
+ return System.getProperty("ebean.dataTimeZone", dataTimeZone);
+ }
+
+ /**
+ * Set the time zone to use when reading/writing Timestamps via JDBC.
+ */
+ public void setDataTimeZone(String dataTimeZone) {
+ this.dataTimeZone = dataTimeZone;
+ }
+
+ /**
+ * Return the suffix appended to the base table to derive the view that contains the union
+ * of the base table and the history table in order to support asOf queries.
+ */
+ public String getAsOfViewSuffix() {
+ return asOfViewSuffix;
+ }
+
+ /**
+ * Set the suffix appended to the base table to derive the view that contains the union
+ * of the base table and the history table in order to support asOf queries.
+ */
+ public void setAsOfViewSuffix(String asOfViewSuffix) {
+ this.asOfViewSuffix = asOfViewSuffix;
+ }
+
+ /**
+ * Return the database column used to support history and 'As of' queries. This column is a timestamp range
+ * or equivalent.
+ */
+ public String getAsOfSysPeriod() {
+ return asOfSysPeriod;
+ }
+
+ /**
+ * Set the database column used to support history and 'As of' queries. This column is a timestamp range
+ * or equivalent.
+ */
+ public void setAsOfSysPeriod(String asOfSysPeriod) {
+ this.asOfSysPeriod = asOfSysPeriod;
+ }
+
+ /**
+ * Return the history table suffix (defaults to _history).
+ */
+ public String getHistoryTableSuffix() {
+ return historyTableSuffix;
+ }
+
+ /**
+ * Set the history table suffix.
+ */
+ public void setHistoryTableSuffix(String historyTableSuffix) {
+ this.historyTableSuffix = historyTableSuffix;
+ }
+
+ /**
+ * Return true if we are running in a JTA Transaction manager.
+ */
+ public boolean isUseJtaTransactionManager() {
+ return useJtaTransactionManager;
+ }
+
+ /**
+ * Set to true if we are running in a JTA Transaction manager.
+ */
+ public void setUseJtaTransactionManager(boolean useJtaTransactionManager) {
+ this.useJtaTransactionManager = useJtaTransactionManager;
+ }
+
+ /**
+ * Return the external transaction manager.
+ */
+ public ExternalTransactionManager getExternalTransactionManager() {
+ return externalTransactionManager;
+ }
+
+ /**
+ * Set the external transaction manager.
+ */
+ public void setExternalTransactionManager(ExternalTransactionManager externalTransactionManager) {
+ this.externalTransactionManager = externalTransactionManager;
+ }
+
+ /**
+ * Return the ServerCachePlugin.
+ */
+ public ServerCachePlugin getServerCachePlugin() {
+ return serverCachePlugin;
+ }
+
+ /**
+ * Set the ServerCachePlugin to use.
+ */
+ public void setServerCachePlugin(ServerCachePlugin serverCachePlugin) {
+ this.serverCachePlugin = serverCachePlugin;
+ }
+
+ /**
+ * Return true if LOB's should default to fetch eager.
+ * By default this is set to false and LOB's must be explicitly fetched.
+ */
+ public boolean isEagerFetchLobs() {
+ return eagerFetchLobs;
+ }
+
+ /**
+ * Set to true if you want LOB's to be fetch eager by default.
+ * By default this is set to false and LOB's must be explicitly fetched.
+ */
+ public void setEagerFetchLobs(boolean eagerFetchLobs) {
+ this.eagerFetchLobs = eagerFetchLobs;
+ }
+
+ /**
+ * Return the max call stack to use for origin location.
+ */
+ public int getMaxCallStack() {
+ return maxCallStack;
+ }
+
+ /**
+ * Set the max call stack to use for origin location.
+ */
+ public void setMaxCallStack(int maxCallStack) {
+ this.maxCallStack = maxCallStack;
+ }
+
+ /**
+ * Return true if transactions should rollback on checked exceptions.
+ */
+ public boolean isTransactionRollbackOnChecked() {
+ return transactionRollbackOnChecked;
+ }
+
+ /**
+ * Set to true if transactions should by default rollback on checked exceptions.
+ */
+ public void setTransactionRollbackOnChecked(boolean transactionRollbackOnChecked) {
+ this.transactionRollbackOnChecked = transactionRollbackOnChecked;
+ }
+
+ /**
+ * Return the Background executor schedule pool size. Defaults to 1.
+ */
+ public int getBackgroundExecutorSchedulePoolSize() {
+ return backgroundExecutorSchedulePoolSize;
+ }
+
+ /**
+ * Set the Background executor schedule pool size.
+ */
+ public void setBackgroundExecutorSchedulePoolSize(int backgroundExecutorSchedulePoolSize) {
+ this.backgroundExecutorSchedulePoolSize = backgroundExecutorSchedulePoolSize;
+ }
+
+ /**
+ * Return the Background executor shutdown seconds. This is the time allowed for the pool to shutdown nicely
+ * before it is forced shutdown.
+ */
+ public int getBackgroundExecutorShutdownSecs() {
+ return backgroundExecutorShutdownSecs;
+ }
+
+ /**
+ * Set the Background executor shutdown seconds. This is the time allowed for the pool to shutdown nicely
+ * before it is forced shutdown.
+ */
+ public void setBackgroundExecutorShutdownSecs(int backgroundExecutorShutdownSecs) {
+ this.backgroundExecutorShutdownSecs = backgroundExecutorShutdownSecs;
+ }
+
+ /**
+ * Return the L2 cache default max size.
+ */
+ public int getCacheMaxSize() {
+ return cacheMaxSize;
+ }
+
+ /**
+ * Set the L2 cache default max size.
+ */
+ public void setCacheMaxSize(int cacheMaxSize) {
+ this.cacheMaxSize = cacheMaxSize;
+ }
+
+ /**
+ * Return the L2 cache default max idle time in seconds.
+ */
+ public int getCacheMaxIdleTime() {
+ return cacheMaxIdleTime;
+ }
+
+ /**
+ * Set the L2 cache default max idle time in seconds.
+ */
+ public void setCacheMaxIdleTime(int cacheMaxIdleTime) {
+ this.cacheMaxIdleTime = cacheMaxIdleTime;
+ }
+
+ /**
+ * Return the L2 cache default max time to live in seconds.
+ */
+ public int getCacheMaxTimeToLive() {
+ return cacheMaxTimeToLive;
+ }
+
+ /**
+ * Set the L2 cache default max time to live in seconds.
+ */
+ public void setCacheMaxTimeToLive(int cacheMaxTimeToLive) {
+ this.cacheMaxTimeToLive = cacheMaxTimeToLive;
+ }
+
+ /**
+ * Return the L2 query cache default max size.
+ */
+ public int getQueryCacheMaxSize() {
+ return queryCacheMaxSize;
+ }
+
+ /**
+ * Set the L2 query cache default max size.
+ */
+ public void setQueryCacheMaxSize(int queryCacheMaxSize) {
+ this.queryCacheMaxSize = queryCacheMaxSize;
+ }
+
+ /**
+ * Return the L2 query cache default max idle time in seconds.
+ */
+ public int getQueryCacheMaxIdleTime() {
+ return queryCacheMaxIdleTime;
+ }
+
+ /**
+ * Set the L2 query cache default max idle time in seconds.
+ */
+ public void setQueryCacheMaxIdleTime(int queryCacheMaxIdleTime) {
+ this.queryCacheMaxIdleTime = queryCacheMaxIdleTime;
+ }
+
+ /**
+ * Return the L2 query cache default max time to live in seconds.
+ */
+ public int getQueryCacheMaxTimeToLive() {
+ return queryCacheMaxTimeToLive;
+ }
+
+ /**
+ * Set the L2 query cache default max time to live in seconds.
+ */
+ public void setQueryCacheMaxTimeToLive(int queryCacheMaxTimeToLive) {
+ this.queryCacheMaxTimeToLive = queryCacheMaxTimeToLive;
+ }
+
+ /**
+ * Return the NamingConvention.
+ *
+ * If none has been set the default UnderscoreNamingConvention is used.
+ */
+ public NamingConvention getNamingConvention() {
+ return namingConvention;
+ }
+
+ /**
+ * Set the NamingConvention.
+ *
+ * If none is set the default UnderscoreNamingConvention is used.
+ */
+ public void setNamingConvention(NamingConvention namingConvention) {
+ this.namingConvention = namingConvention;
+ }
+
+ /**
+ * Return true if all DB column and table names should use quoted identifiers.
+ */
+ public boolean isAllQuotedIdentifiers() {
+ return platformConfig.isAllQuotedIdentifiers();
+ }
+
+ /**
+ * Set to true if all DB column and table names should use quoted identifiers.
+ */
+ public void setAllQuotedIdentifiers(boolean allQuotedIdentifiers) {
+ platformConfig.setAllQuotedIdentifiers(allQuotedIdentifiers);
+ if (allQuotedIdentifiers) {
+ adjustNamingConventionForAllQuoted();
+ }
+ }
+
+ private void adjustNamingConventionForAllQuoted() {
+ if (namingConvention instanceof UnderscoreNamingConvention) {
+ // we need to use matching naming convention
+ this.namingConvention = new MatchingNamingConvention();
+ }
+ }
+
+ /**
+ * Return true if this Database is a Document store only instance (has no JDBC DB).
+ */
+ public boolean isDocStoreOnly() {
+ return docStoreOnly;
+ }
+
+ /**
+ * Set to true if this Database is Document store only instance (has no JDBC DB).
+ */
+ public void setDocStoreOnly(boolean docStoreOnly) {
+ this.docStoreOnly = docStoreOnly;
+ }
+
+ /**
+ * Return the configuration for the ElasticSearch integration.
+ */
+ public DocStoreConfig getDocStoreConfig() {
+ return docStoreConfig;
+ }
+
+ /**
+ * Set the configuration for the ElasticSearch integration.
+ */
+ public void setDocStoreConfig(DocStoreConfig docStoreConfig) {
+ this.docStoreConfig = docStoreConfig;
+ }
+
+ /**
+ * Return the constraint naming convention used in DDL generation.
+ */
+ public DbConstraintNaming getConstraintNaming() {
+ return platformConfig.getConstraintNaming();
+ }
+
+ /**
+ * Set the constraint naming convention used in DDL generation.
+ */
+ public void setConstraintNaming(DbConstraintNaming constraintNaming) {
+ platformConfig.setConstraintNaming(constraintNaming);
+ }
+
+ /**
+ * Return the configuration for AutoTune.
+ */
+ public AutoTuneConfig getAutoTuneConfig() {
+ return autoTuneConfig;
+ }
+
+ /**
+ * Set the configuration for AutoTune.
+ */
+ public void setAutoTuneConfig(AutoTuneConfig autoTuneConfig) {
+ this.autoTuneConfig = autoTuneConfig;
+ }
+
+ /**
+ * Return the DataSource.
+ */
+ public DataSource getDataSource() {
+ return dataSource;
+ }
+
+ /**
+ * Set a DataSource.
+ */
+ public void setDataSource(DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ /**
+ * Return the read only DataSource.
+ */
+ public DataSource getReadOnlyDataSource() {
+ return readOnlyDataSource;
+ }
+
+ /**
+ * Set the read only DataSource.
+ *
+ * Note that the DataSource is expected to use AutoCommit true mode avoiding the need
+ * for explicit commit (or rollback).
+ *
+ * This read only DataSource will be used for implicit query only transactions. It is not
+ * used if the transaction is created explicitly or if the query is an update or delete query.
+ */
+ public void setReadOnlyDataSource(DataSource readOnlyDataSource) {
+ this.readOnlyDataSource = readOnlyDataSource;
+ }
+
+ /**
+ * Return the configuration to build a DataSource using Ebean's own DataSource
+ * implementation.
+ */
+ public DataSourceConfig getDataSourceConfig() {
+ return dataSourceConfig;
+ }
+
+ /**
+ * Set the configuration required to build a DataSource using Ebean's own
+ * DataSource implementation.
+ */
+ public void setDataSourceConfig(DataSourceConfig dataSourceConfig) {
+ this.dataSourceConfig = dataSourceConfig;
+ }
+
+ /**
+ * Return true if Ebean should create a DataSource for use with implicit read only transactions.
+ */
+ public boolean isAutoReadOnlyDataSource() {
+ return autoReadOnlyDataSource;
+ }
+
+ /**
+ * Set to true if Ebean should create a DataSource for use with implicit read only transactions.
+ */
+ public void setAutoReadOnlyDataSource(boolean autoReadOnlyDataSource) {
+ this.autoReadOnlyDataSource = autoReadOnlyDataSource;
+ }
+
+ /**
+ * Return the configuration for the read only DataSource.
+ *
+ * This is only used if autoReadOnlyDataSource is true.
+ *
+ * The driver, url, username and password default to the configuration for the main DataSource if they are not
+ * set on this configuration. This means there is actually no need to set any configuration here and we only
+ * set configuration for url, username and password etc if it is different from the main DataSource.
+ */
+ public DataSourceConfig getReadOnlyDataSourceConfig() {
+ return readOnlyDataSourceConfig;
+ }
+
+ /**
+ * Set the configuration for the read only DataSource.
+ */
+ public void setReadOnlyDataSourceConfig(DataSourceConfig readOnlyDataSourceConfig) {
+ this.readOnlyDataSourceConfig = readOnlyDataSourceConfig;
+ }
+
+ /**
+ * Return the JNDI name of the DataSource to use.
+ */
+ public String getDataSourceJndiName() {
+ return dataSourceJndiName;
+ }
+
+ /**
+ * Set the JNDI name of the DataSource to use.
+ *
+ * By default a prefix of "java:comp/env/jdbc/" is used to lookup the
+ * DataSource. This prefix is not used if dataSourceJndiName starts with
+ * "java:".
+ */
+ public void setDataSourceJndiName(String dataSourceJndiName) {
+ this.dataSourceJndiName = dataSourceJndiName;
+ }
+
+ /**
+ * Return a value used to represent TRUE in the database.
+ *
+ * This is used for databases that do not support boolean natively.
+ *
+ * The value returned is either a Integer or a String (e.g. "1", or "T").
+ */
+ public String getDatabaseBooleanTrue() {
+ return platformConfig.getDatabaseBooleanTrue();
+ }
+
+ /**
+ * Set the value to represent TRUE in the database.
+ *
+ * This is used for databases that do not support boolean natively.
+ *
+ * The value set is either a Integer or a String (e.g. "1", or "T").
+ */
+ public void setDatabaseBooleanTrue(String databaseTrue) {
+ platformConfig.setDatabaseBooleanTrue(databaseTrue);
+ }
+
+ /**
+ * Return a value used to represent FALSE in the database.
+ *
+ * This is used for databases that do not support boolean natively.
+ *
+ * The value returned is either a Integer or a String (e.g. "0", or "F").
+ */
+ public String getDatabaseBooleanFalse() {
+ return platformConfig.getDatabaseBooleanFalse();
+ }
+
+ /**
+ * Set the value to represent FALSE in the database.
+ *
+ * This is used for databases that do not support boolean natively.
+ *
+ * The value set is either a Integer or a String (e.g. "0", or "F").
+ */
+ public void setDatabaseBooleanFalse(String databaseFalse) {
+ this.platformConfig.setDatabaseBooleanFalse(databaseFalse);
+ }
+
+ /**
+ * Return the number of DB sequence values that should be preallocated.
+ */
+ public int getDatabaseSequenceBatchSize() {
+ return platformConfig.getDatabaseSequenceBatchSize();
+ }
+
+ /**
+ * Set the number of DB sequence values that should be preallocated and cached
+ * by Ebean.
+ *
+ * This is only used for DB's that use sequences and is a performance
+ * optimisation. This reduces the number of times Ebean needs to get a
+ * sequence value from the Database reducing network chatter.
+ *
+ * By default this value is 10 so when we need another Id (and don't have one
+ * in our cache) Ebean will fetch 10 id's from the database. Note that when
+ * the cache drops to have full (which is 5 by default) Ebean will fetch
+ * another batch of Id's in a background thread.
+ */
+ public void setDatabaseSequenceBatch(int databaseSequenceBatchSize) {
+ this.platformConfig.setDatabaseSequenceBatchSize(databaseSequenceBatchSize);
+ }
+
+ /**
+ * Return the database platform name (can be null).
+ *
+ * If null then the platform is determined automatically via the JDBC driver
+ * information.
+ */
+ public String getDatabasePlatformName() {
+ return databasePlatformName;
+ }
+
+ /**
+ * Explicitly set the database platform name
+ *
+ * If none is set then the platform is determined automatically via the JDBC
+ * driver information.
+ *
+ * This can be used when the Database Platform can not be automatically
+ * detected from the JDBC driver (possibly 3rd party JDBC driver). It is also
+ * useful when you want to do offline DDL generation for a database platform
+ * that you don't have access to.
+ *
+ * Values are oracle, h2, postgres, mysql, sqlserver16, sqlserver17.
+ */
+ public void setDatabasePlatformName(String databasePlatformName) {
+ this.databasePlatformName = databasePlatformName;
+ }
+
+ /**
+ * Return the database platform to use for this database.
+ */
+ public DatabasePlatform getDatabasePlatform() {
+ return databasePlatform;
+ }
+
+ /**
+ * Explicitly set the database platform to use.
+ *
+ * If none is set then the platform is determined via the databasePlatformName
+ * or automatically via the JDBC driver information.
+ */
+ public void setDatabasePlatform(DatabasePlatform databasePlatform) {
+ this.databasePlatform = databasePlatform;
+ }
+
+ /**
+ * Return the preferred DB platform IdType.
+ */
+ public IdType getIdType() {
+ return platformConfig.getIdType();
+ }
+
+ /**
+ * Set the preferred DB platform IdType.
+ */
+ public void setIdType(IdType idType) {
+ this.platformConfig.setIdType(idType);
+ }
+
+ /**
+ * Return the EncryptKeyManager.
+ */
+ public EncryptKeyManager getEncryptKeyManager() {
+ return encryptKeyManager;
+ }
+
+ /**
+ * Set the EncryptKeyManager.
+ *
+ * This is required when you want to use encrypted properties.
+ *
+ * You can also set this in ebean.proprerties:
+ *
+ *
+ * This is optionally used to programmatically define which columns are
+ * encrypted instead of using the {@link Encrypted} Annotation.
+ */
+ public EncryptDeployManager getEncryptDeployManager() {
+ return encryptDeployManager;
+ }
+
+ /**
+ * Set the EncryptDeployManager.
+ *
+ * This is optionally used to programmatically define which columns are
+ * encrypted instead of using the {@link Encrypted} Annotation.
+ */
+ public void setEncryptDeployManager(EncryptDeployManager encryptDeployManager) {
+ this.encryptDeployManager = encryptDeployManager;
+ }
+
+ /**
+ * Return the Encryptor used to encrypt data on the java client side (as
+ * opposed to DB encryption functions).
+ */
+ public Encryptor getEncryptor() {
+ return encryptor;
+ }
+
+ /**
+ * Set the Encryptor used to encrypt data on the java client side (as opposed
+ * to DB encryption functions).
+ *
+ * Ebean has a default implementation that it will use if you do not set your
+ * own Encryptor implementation.
+ */
+ public void setEncryptor(Encryptor encryptor) {
+ this.encryptor = encryptor;
+ }
+
+ /**
+ * Return true if the Database instance should be created in offline mode.
+ */
+ public boolean isDbOffline() {
+ return dbOffline;
+ }
+
+ /**
+ * Set to true if the Database instance should be created in offline mode.
+ *
+ * Typically used to create an Database instance for DDL Migration generation
+ * without requiring a real DataSource / Database to connect to.
+ */
+ public void setDbOffline(boolean dbOffline) {
+ this.dbOffline = dbOffline;
+ }
+
+ /**
+ * Return the DbEncrypt used to encrypt and decrypt properties.
+ *
+ * Note that if this is not set then the DbPlatform may already have a
+ * DbEncrypt set and that will be used.
+ */
+ public DbEncrypt getDbEncrypt() {
+ return dbEncrypt;
+ }
+
+ /**
+ * Set the DbEncrypt used to encrypt and decrypt properties.
+ *
+ * Note that if this is not set then the DbPlatform may already have a
+ * DbEncrypt set (H2, MySql, Postgres and Oracle platforms have a DbEncrypt)
+ */
+ public void setDbEncrypt(DbEncrypt dbEncrypt) {
+ this.dbEncrypt = dbEncrypt;
+ }
+
+ /**
+ * Return the configuration for DB types (such as UUID and custom mappings).
+ */
+ public PlatformConfig getPlatformConfig() {
+ return platformConfig;
+ }
+
+ /**
+ * Set the configuration for DB platform (such as UUID and custom mappings).
+ */
+ public void setPlatformConfig(PlatformConfig platformConfig) {
+ this.platformConfig = platformConfig;
+ }
+
+ /**
+ * Set the DB type used to store UUID.
+ */
+ public void setDbUuid(PlatformConfig.DbUuid dbUuid) {
+ this.platformConfig.setDbUuid(dbUuid);
+ }
+
+ /**
+ * Returns the UUID version mode.
+ */
+ public UuidVersion getUuidVersion() {
+ return uuidVersion;
+ }
+
+ /**
+ * Sets the UUID version mode.
+ */
+ public void setUuidVersion(UuidVersion uuidVersion) {
+ this.uuidVersion = uuidVersion;
+ }
+
+ /**
+ * Return the UUID state file.
+ */
+ public String getUuidStateFile() {
+ if (uuidStateFile == null || uuidStateFile.isEmpty()) {
+ // by default, add servername...
+ uuidStateFile = name + "-uuid.state";
+ // and store it in the user's home directory
+ String homeDir = System.getProperty("user.home");
+ if (homeDir != null && homeDir.isEmpty()) {
+ uuidStateFile = homeDir + "/.ebean/" + uuidStateFile;
+ }
+ }
+ return uuidStateFile;
+ }
+
+ /**
+ * Set the UUID state file.
+ */
+ public void setUuidStateFile(String uuidStateFile) {
+ this.uuidStateFile = uuidStateFile;
+ }
+
+ /**
+ * Return true if LocalTime should be persisted with nanos precision.
+ */
+ public boolean isLocalTimeWithNanos() {
+ return localTimeWithNanos;
+ }
+
+ /**
+ * Set to true if LocalTime should be persisted with nanos precision.
+ *
+ * Otherwise it is persisted using java.sql.Time which is seconds precision.
+ */
+ public void setLocalTimeWithNanos(boolean localTimeWithNanos) {
+ this.localTimeWithNanos = localTimeWithNanos;
+ }
+
+ /**
+ * Return true if Duration should be persisted with nanos precision (SQL DECIMAL).
+ *
+ * Otherwise it is persisted with second precision (SQL INTEGER).
+ */
+ public boolean isDurationWithNanos() {
+ return durationWithNanos;
+ }
+
+ /**
+ * Set to true if Duration should be persisted with nanos precision (SQL DECIMAL).
+ *
+ * Otherwise it is persisted with second precision (SQL INTEGER).
+ */
+ public void setDurationWithNanos(boolean durationWithNanos) {
+ this.durationWithNanos = durationWithNanos;
+ }
+
+ /**
+ * Set to true to run DB migrations on server start.
+ *
+ * This is the same as serverConfig.getMigrationConfig().setRunMigration(). We have added this method here
+ * as it is often the only thing we need to configure for migrations.
+ */
+ public void setRunMigration(boolean runMigration) {
+ migrationConfig.setRunMigration(runMigration);
+ }
+
+ /**
+ * Set to true to generate the "create all" DDL on startup.
+ *
+ * Typically we want this on when we are running tests locally (and often using H2)
+ * and we want to create the full DB schema from scratch to run tests.
+ */
+ public void setDdlGenerate(boolean ddlGenerate) {
+ this.ddlGenerate = ddlGenerate;
+ }
+
+ /**
+ * Set to true to run the generated "create all DDL" on startup.
+ *
+ * Typically we want this on when we are running tests locally (and often using H2)
+ * and we want to create the full DB schema from scratch to run tests.
+ */
+ public void setDdlRun(boolean ddlRun) {
+ this.ddlRun = ddlRun;
+ }
+
+ /**
+ * Set to false if you not want to run the extra-ddl.xml scripts. (default = true)
+ *
+ * Typically we want this on when we are running tests.
+ */
+ public void setDdlExtra(boolean ddlExtra) {
+ this.ddlExtra = ddlExtra;
+ }
+
+
+ /**
+ * Return true if the "drop all ddl" should be skipped.
+ *
+ * Typically we want to do this when using H2 (in memory) as our test database and the drop statements
+ * are not required so skipping the drop table statements etc makes it faster with less noise in the logs.
+ */
+ public boolean isDdlCreateOnly() {
+ return ddlCreateOnly;
+ }
+
+ /**
+ * Set to true if the "drop all ddl" should be skipped.
+ *
+ * Typically we want to do this when using H2 (in memory) as our test database and the drop statements
+ * are not required so skipping the drop table statements etc makes it faster with less noise in the logs.
+ */
+ public void setDdlCreateOnly(boolean ddlCreateOnly) {
+ this.ddlCreateOnly = ddlCreateOnly;
+ }
+
+ /**
+ * Return SQL script to execute after the "create all" DDL has been run.
+ *
+ * Typically this is a sql script that inserts test seed data when running tests.
+ * Place a sql script in src/test/resources that inserts test seed data.
+ */
+ public String getDdlSeedSql() {
+ return ddlSeedSql;
+ }
+
+ /**
+ * Set a SQL script to execute after the "create all" DDL has been run.
+ *
+ * Typically this is a sql script that inserts test seed data when running tests.
+ * Place a sql script in src/test/resources that inserts test seed data.
+ */
+ public void setDdlSeedSql(String ddlSeedSql) {
+ this.ddlSeedSql = ddlSeedSql;
+ }
+
+ /**
+ * Return a SQL script to execute before the "create all" DDL has been run.
+ */
+ public String getDdlInitSql() {
+ return ddlInitSql;
+ }
+
+ /**
+ * Set a SQL script to execute before the "create all" DDL has been run.
+ */
+ public void setDdlInitSql(String ddlInitSql) {
+ this.ddlInitSql = ddlInitSql;
+ }
+
+ /**
+ * Return true if the DDL should be generated.
+ */
+ public boolean isDdlGenerate() {
+ return ddlGenerate;
+ }
+
+ /**
+ * Return true if the DDL should be run.
+ */
+ public boolean isDdlRun() {
+ return ddlRun;
+ }
+
+ /**
+ * Return true, if extra-ddl.xml should be executed.
+ */
+ public boolean isDdlExtra() {
+ return ddlExtra;
+ }
+
+ /**
+ * Return true if the class path search should be disabled.
+ */
+ public boolean isDisableClasspathSearch() {
+ return disableClasspathSearch;
+ }
+
+ /**
+ * Set to true to disable the class path search even for the case where no entity bean classes
+ * have been registered. This can be used to start an Database instance just to use the
+ * SQL functions such as SqlQuery, SqlUpdate etc.
+ */
+ public void setDisableClasspathSearch(boolean disableClasspathSearch) {
+ this.disableClasspathSearch = disableClasspathSearch;
+ }
+
+ /**
+ * Return the mode to use for Joda LocalTime support 'normal' or 'utc'.
+ */
+ public String getJodaLocalTimeMode() {
+ return jodaLocalTimeMode;
+ }
+
+ /**
+ * Set the mode to use for Joda LocalTime support 'normal' or 'utc'.
+ */
+ public void setJodaLocalTimeMode(String jodaLocalTimeMode) {
+ this.jodaLocalTimeMode = jodaLocalTimeMode;
+ }
+
+ /**
+ * Programmatically add classes (typically entities) that this server should
+ * use.
+ *
+ * The class can be an Entity, Embedded type, ScalarType, BeanPersistListener,
+ * BeanFinder or BeanPersistController.
+ *
+ * If no classes are specified then the classes are found automatically via
+ * searching the class path.
+ *
+ * Alternatively the classes can be added via {@link #setClasses(List)}.
+ *
+ * @param cls the entity type (or other type) that should be registered by this
+ * database.
+ */
+ public void addClass(Class> cls) {
+ classes.add(cls);
+ }
+
+ /**
+ * Register all the classes (typically entity classes).
+ */
+ public void addAll(List
+ * This is only used if classes have not been explicitly specified.
+ */
+ public void addPackage(String packageName) {
+ packages.add(packageName);
+ }
+
+ /**
+ * Return packages to search for entities via class path search.
+ *
+ * This is only used if classes have not been explicitly specified.
+ */
+ public List
+ * This is only used if classes have not been explicitly specified.
+ */
+ public void setPackages(List
+ * If no classes are specified then the classes are found automatically via
+ * searching the class path.
+ *
+ * Alternatively the classes can contain added via {@link #addClass(Class)}.
+ */
+ public void setClasses(List
+ * This defaults to true and means that for "find by id" and "find by natural key"
+ * queries that normally hit L2 bean cache automatically will not do so after a write/persist
+ * on the transaction.
+ *
+ *
+ * This mode can be explicitly set per transaction.
+ *
+ * @see Transaction#setUpdateAllLoadedProperties(boolean)
+ */
+ public void setUpdateAllPropertiesInBatch(boolean updateAllPropertiesInBatch) {
+ this.updateAllPropertiesInBatch = updateAllPropertiesInBatch;
+ }
+
+ /**
+ * Returns the resource directory.
+ */
+ public String getResourceDirectory() {
+ return resourceDirectory;
+ }
+
+ /**
+ * Sets the resource directory.
+ */
+ public void setResourceDirectory(String resourceDirectory) {
+ this.resourceDirectory = resourceDirectory;
+ }
+
+ /**
+ * Add a custom type mapping.
+ *
+ *
+ *
+ * Note alternatively you can use {@link #setQueryAdapters(List)} to set all
+ * the BeanQueryAdapter instances.
+ */
+ public void add(BeanQueryAdapter beanQueryAdapter) {
+ queryAdapters.add(beanQueryAdapter);
+ }
+
+ /**
+ * Return the BeanQueryAdapter instances.
+ */
+ public List
+ * Note alternatively you can use {@link #add(BeanQueryAdapter)} to add
+ * BeanQueryAdapter instances one at a time.
+ */
+ public void setQueryAdapters(List
+ * Note alternatively you can use {@link #setPersistControllers(List)} to set
+ * all the BeanPersistController instances.
+ */
+ public void add(BeanPersistController beanPersistController) {
+ persistControllers.add(beanPersistController);
+ }
+
+ /**
+ * Register a BeanPostLoad instance.
+ *
+ * Note alternatively you can use {@link #setPostLoaders(List)} to set
+ * all the BeanPostLoad instances.
+ */
+ public void add(BeanPostLoad postLoad) {
+ postLoaders.add(postLoad);
+ }
+
+ /**
+ * Register a BeanPostConstructListener instance.
+ *
+ * Note alternatively you can use {@link #setPostConstructListeners(List)} to set
+ * all the BeanPostConstructListener instances.
+ */
+ public void add(BeanPostConstructListener listener) {
+ postConstructListeners.add(listener);
+ }
+
+ /**
+ * Return the list of BeanFindController instances.
+ */
+ public List
+ * Note alternatively you can use {@link #add(BeanPersistController)} to add
+ * BeanPersistController instances one at a time.
+ */
+ public void setPersistControllers(List
+ * Note alternatively you can use {@link #setPersistListeners(List)} to set
+ * all the BeanPersistListener instances.
+ */
+ public void add(BeanPersistListener beanPersistListener) {
+ persistListeners.add(beanPersistListener);
+ }
+
+ /**
+ * Return the BeanPersistListener instances.
+ */
+ public List
+ * Note alternatively you can use {@link #add(BeanPersistListener)} to add
+ * BeanPersistListener instances one at a time.
+ */
+ public void setPersistListeners(List
+ * Note that this is not strongly typed as Jackson ObjectMapper is an optional dependency.
+ */
+ public Object getObjectMapper() {
+ return objectMapper;
+ }
+
+ /**
+ * Set the Jackson ObjectMapper.
+ *
+ * Note that this is not strongly typed as Jackson ObjectMapper is an optional dependency.
+ */
+ public void setObjectMapper(Object objectMapper) {
+ this.objectMapper = objectMapper;
+ }
+
+ /**
+ * Return true if eq("someProperty", null) should to generate "1=1" rather than "is null" sql expression.
+ */
+ public boolean isExpressionEqualsWithNullAsNoop() {
+ return expressionEqualsWithNullAsNoop;
+ }
+
+ /**
+ * Set to true if you want eq("someProperty", null) to generate "1=1" rather than "is null" sql expression.
+ *
+ * Setting this to true has the effect that eq(propertyName, value), ieq(propertyName, value) and
+ * ne(propertyName, value) have no effect when the value is null. The expression factory adds a NoopExpression
+ * which will add "1=1" into the SQL rather than "is null".
+ */
+ public void setExpressionEqualsWithNullAsNoop(boolean expressionEqualsWithNullAsNoop) {
+ this.expressionEqualsWithNullAsNoop = expressionEqualsWithNullAsNoop;
+ }
+
+ /**
+ * Return true if native ILIKE expression should be used if supported by the database platform (e.g. Postgres).
+ */
+ public boolean isExpressionNativeIlike() {
+ return expressionNativeIlike;
+ }
+
+ /**
+ * Set to true to use native ILIKE expression if supported by the database platform (e.g. Postgres).
+ */
+ public void setExpressionNativeIlike(boolean expressionNativeIlike) {
+ this.expressionNativeIlike = expressionNativeIlike;
+ }
+
+ /**
+ * Return the enabled L2 cache regions.
+ */
+ public String getEnabledL2Regions() {
+ return enabledL2Regions;
+ }
+
+ /**
+ * Set the enabled L2 cache regions (comma delimited).
+ */
+ public void setEnabledL2Regions(String enabledL2Regions) {
+ this.enabledL2Regions = enabledL2Regions;
+ }
+
+ /**
+ * Return true if L2 cache is disabled.
+ */
+ public boolean isDisableL2Cache() {
+ return disableL2Cache;
+ }
+
+ /**
+ * Set to true to disable L2 caching. Typically useful in performance testing.
+ */
+ public void setDisableL2Cache(boolean disableL2Cache) {
+ this.disableL2Cache = disableL2Cache;
+ }
+
+ /**
+ * Return true to use local only L2 cache. Effectively ignore l2 cache plugin like ebean-redis etc.
+ */
+ public boolean isLocalOnlyL2Cache() {
+ return localOnlyL2Cache;
+ }
+
+ /**
+ * Force the use of local only L2 cache. Effectively ignore l2 cache plugin like ebean-redis etc.
+ */
+ public void setLocalOnlyL2Cache(boolean localOnlyL2Cache) {
+ this.localOnlyL2Cache = localOnlyL2Cache;
+ }
+
+ /**
+ * Returns if we use javax.validation.constraints.NotNull
+ */
+ public boolean isUseJavaxValidationNotNull() {
+ return useJavaxValidationNotNull;
+ }
+
+ /**
+ * Controls if Ebean should ignore
+ * Normally when Ebean sees javax NotNull annotation it means that column is defined as NOT NULL.
+ * Set this to
+ * In general we don't want to do that as when we use a distributed cache (like Ignite, Hazelcast etc)
+ * we are making network calls and we prefer to do this in background and not impact the response time
+ * of the executing transaction.
+ */
+ public void setNotifyL2CacheInForeground(boolean notifyL2CacheInForeground) {
+ this.notifyL2CacheInForeground = notifyL2CacheInForeground;
+ }
+
+ /**
+ * Return the query plan time to live.
+ */
+ public int getQueryPlanTTLSeconds() {
+ return queryPlanTTLSeconds;
+ }
+
+ /**
+ * Set the query plan time to live.
+ */
+ public void setQueryPlanTTLSeconds(int queryPlanTTLSeconds) {
+ this.queryPlanTTLSeconds = queryPlanTTLSeconds;
+ }
+
+ /**
+ * Run the DB migration against the DataSource.
+ */
+ public DataSource runDbMigration(DataSource dataSource) {
+ if (migrationConfig.isRunMigration()) {
+ MigrationRunner runner = migrationConfig.createRunner(getClassLoadConfig().getClassLoader(), properties);
+ runner.run(dataSource);
+ }
+ return dataSource;
+ }
+
+ /**
+ * Create a new PlatformConfig based of the one held but with overridden properties by reading
+ * properties with the given path and prefix.
+ *
+ * Typically used in Db Migration generation for many platform targets that might have different
+ * configuration for IdType, UUID, quoted identifiers etc.
+ *
+ * @param propertiesPath The properties path used for loading and setting properties
+ * @param platformPrefix The prefix used for loading and setting properties
+ * @return A copy of the PlatformConfig with overridden properties
+ */
+ public PlatformConfig newPlatformConfig(String propertiesPath, String platformPrefix) {
+ if (properties == null) {
+ properties = new Properties();
+ }
+ PropertiesWrapper p = new PropertiesWrapper(propertiesPath, platformPrefix, properties, classLoadConfig);
+ PlatformConfig config = new PlatformConfig(platformConfig);
+ config.loadSettings(p);
+ return config;
+ }
+
+ /**
+ * Add a mapping location to search for xml mapping via class path search.
+ */
+ public void addMappingLocation(String mappingLocation) {
+ if (mappingLocations == null) {
+ mappingLocations = new ArrayList<>();
+ }
+ mappingLocations.add(mappingLocation);
+ }
+
+ /**
+ * Return mapping locations to search for xml mapping via class path search.
+ */
+ public List
+ * This is only used if classes have not been explicitly specified.
+ */
+ public void setMappingLocations(List
+ * When false we either register entity classes via application code or use classpath
+ * scanning to find and register entity classes.
+ */
+ public boolean isAutoLoadModuleInfo() {
+ return loadModuleInfo && classes.isEmpty();
+ }
+
+ /**
+ * Set false to turn off automatic registration of entity beans.
+ *
+ * When using query beans that also generates a module info class that
+ * can register the entity bean classes (to avoid classpath scanning).
+ * This is on by default and setting this to false turns it off.
+ */
+ public void setLoadModuleInfo(boolean loadModuleInfo) {
+ this.loadModuleInfo = loadModuleInfo;
+ }
+
+ public enum UuidVersion {
+ VERSION4,
+ VERSION1,
+ VERSION1RND
+ }
}
diff --git a/src/main/java/io/ebean/config/DatabaseConfigProvider.java b/src/main/java/io/ebean/config/DatabaseConfigProvider.java
new file mode 100644
index 000000000..7ace758e3
--- /dev/null
+++ b/src/main/java/io/ebean/config/DatabaseConfigProvider.java
@@ -0,0 +1,39 @@
+package io.ebean.config;
+
+/**
+ * Provides a ServiceLoader based mechanism to configure a ServerConfig.
+ *
+ * Provide an implementation and register it via the standard Java ServiceLoader mechanism
+ * via a file at
+ * If you are using a DI container like Spring or Guice you are unlikely to use this but instead use a
+ * spring specific configuration. When we are not using a DI container we may use this mechanism to
+ * explicitly register the entity beans and avoid classpath scanning.
+ *
+ * Typically we explicitly register entity bean classes and thus avoid classpath scanning.
+ *
- * NB: ModuleInfoLoader implementations are generated by querybean generator.
- * Having this on and registering entity classes means we don't need to manually
- * write that code or use classpath scanning to find entity classes.
- */
- private boolean loadModuleInfo = true;
-
- /**
- * List of interesting classes such as entities, embedded, ScalarTypes,
- * Listeners, Finders, Controllers etc.
- */
- private List
- * autoReadOnlyDataSource is an unfortunate name for this config option but I haven't come up with a better one.
- */
- private boolean autoReadOnlyDataSource;
-
- /**
- * Optional configuration for a read only data source.
- */
- private DataSourceConfig readOnlyDataSourceConfig = new DataSourceConfig();
-
- /**
- * Optional - the database schema that should be used to own the tables etc.
- */
- private String dbSchema;
-
- /**
- * The db migration config (migration resource path etc).
- */
- private DbMigrationConfig migrationConfig = new DbMigrationConfig();
-
- /**
- * The ClassLoadConfig used to detect Joda, Java8, Jackson etc and create plugin instances given a className.
- */
- private ClassLoadConfig classLoadConfig = new ClassLoadConfig();
-
- /**
- * The data source JNDI name if using a JNDI DataSource.
- */
- private String dataSourceJndiName;
-
- /**
- * The naming convention.
- */
- private NamingConvention namingConvention = new UnderscoreNamingConvention();
-
- /**
- * Behaviour of updates in JDBC batch to by default include all properties.
- */
- private boolean updateAllPropertiesInBatch;
-
- /**
- * Database platform configuration.
- */
- private PlatformConfig platformConfig = new PlatformConfig();
-
- /**
- * The UUID version to use.
- */
- private UuidVersion uuidVersion = UuidVersion.VERSION4;
-
- /**
- * The UUID state file (for Version 1 UUIDs). By default, the file is created in
- * ${HOME}/.ebean/${servername}-uuid.state
- */
- private String uuidStateFile;
-
- /**
- * The clock used for setting the timestamps (e.g. @UpdatedTimestamp) on objects.
- */
- private Clock clock = Clock.systemUTC();
-
- private List
- * For example, put IgniteConfiguration in to be passed to the Ignite plugin.
- */
- public void putServiceObject(String key, Object configObject) {
- serviceObject.put(key, configObject);
- }
-
- /**
- * Return the service object given the key.
- */
- public Object getServiceObject(String key) {
- return serviceObject.get(key);
- }
-
- /**
- * Put a service object into configuration such that it can be passed to a plugin.
- *
- * P getServiceObject(Class cls) {
- return (P) serviceObject.get(serviceObjectKey(cls));
- }
-
- /**
- * Return the Jackson JsonFactory to use.
- *
- * If not set a default implementation will be used.
- */
- public JsonFactory getJsonFactory() {
- return jsonFactory;
- }
-
- /**
- * Set the Jackson JsonFactory to use.
- *
- * If not set a default implementation will be used.
- */
- public void setJsonFactory(JsonFactory jsonFactory) {
- this.jsonFactory = jsonFactory;
- }
-
- /**
- * Return the JSON format used for DateTime types.
- */
- public JsonConfig.DateTime getJsonDateTime() {
- return jsonDateTime;
- }
-
- /**
- * Set the JSON format to use for DateTime types.
- */
- public void setJsonDateTime(JsonConfig.DateTime jsonDateTime) {
- this.jsonDateTime = jsonDateTime;
- }
-
- /**
- * Return the JSON format used for Date types.
- */
- public JsonConfig.Date getJsonDate() {
- return jsonDate;
- }
-
- /**
- * Set the JSON format to use for Date types.
- */
- public void setJsonDate(JsonConfig.Date jsonDate) {
- this.jsonDate = jsonDate;
- }
-
- /**
- * Return the JSON include mode used when writing JSON.
- */
- public JsonConfig.Include getJsonInclude() {
- return jsonInclude;
- }
-
- /**
- * Set the JSON include mode used when writing JSON.
- *
- * Set to NON_NULL or NON_EMPTY to suppress nulls or null and empty collections respectively.
- */
- public void setJsonInclude(JsonConfig.Include jsonInclude) {
- this.jsonInclude = jsonInclude;
- }
-
- /**
- * Return the name of the Database.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Set the name of the Database.
- */
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * Return the container / clustering configuration.
- *
- * By default this is set to true.
- */
- public boolean isRegister() {
- return register;
- }
-
- /**
- * Set to false if you do not want this server to be registered with the Ebean
- * singleton when it is created.
- *
- * By default this is set to true.
- */
- public void setRegister(boolean register) {
- this.register = register;
- }
-
- /**
- * Return true if this server should be registered as the "default" server
- * with the Ebean singleton.
- *
- * This is only used when {@link #setRegister(boolean)} is also true.
- */
- public boolean isDefaultServer() {
- return defaultServer;
- }
-
- /**
- * Set false if you do not want this Database to be registered as the "default" database
- * with the DB singleton.
- *
- * This is only used when {@link #setRegister(boolean)} is also true.
- */
- public void setDefaultServer(boolean defaultServer) {
- this.defaultServer = defaultServer;
- }
-
- /**
- * Return the CurrentUserProvider. This is used to populate @WhoCreated, @WhoModified and
- * support other audit features (who executed a query etc).
- */
- public CurrentUserProvider getCurrentUserProvider() {
- return currentUserProvider;
- }
-
- /**
- * Set the CurrentUserProvider. This is used to populate @WhoCreated, @WhoModified and
- * support other audit features (who executed a query etc).
- */
- public void setCurrentUserProvider(CurrentUserProvider currentUserProvider) {
- this.currentUserProvider = currentUserProvider;
- }
-
- /**
- * Return the tenancy mode used.
- */
- public TenantMode getTenantMode() {
- return tenantMode;
- }
-
- /**
- * Set the tenancy mode to use.
- */
- public void setTenantMode(TenantMode tenantMode) {
- this.tenantMode = tenantMode;
- }
-
- /**
- * Return the column name used for TenantMode.PARTITION.
- */
- public String getTenantPartitionColumn() {
- return tenantPartitionColumn;
- }
-
- /**
- * Set the column name used for TenantMode.PARTITION.
- */
- public void setTenantPartitionColumn(String tenantPartitionColumn) {
- this.tenantPartitionColumn = tenantPartitionColumn;
- }
-
- /**
- * Return the current tenant provider.
- */
- public CurrentTenantProvider getCurrentTenantProvider() {
- return currentTenantProvider;
- }
-
- /**
- * Set the current tenant provider.
- */
- public void setCurrentTenantProvider(CurrentTenantProvider currentTenantProvider) {
- this.currentTenantProvider = currentTenantProvider;
- }
-
- /**
- * Return the tenancy datasource provider.
- */
- public TenantDataSourceProvider getTenantDataSourceProvider() {
- return tenantDataSourceProvider;
- }
-
- /**
- * Set the tenancy datasource provider.
- */
- public void setTenantDataSourceProvider(TenantDataSourceProvider tenantDataSourceProvider) {
- this.tenantDataSourceProvider = tenantDataSourceProvider;
- }
-
- /**
- * Return the tenancy schema provider.
- */
- public TenantSchemaProvider getTenantSchemaProvider() {
- return tenantSchemaProvider;
- }
-
- /**
- * Set the tenancy schema provider.
- */
- public void setTenantSchemaProvider(TenantSchemaProvider tenantSchemaProvider) {
- this.tenantSchemaProvider = tenantSchemaProvider;
- }
-
- /**
- * Return the tenancy catalog provider.
- */
- public TenantCatalogProvider getTenantCatalogProvider() {
- return tenantCatalogProvider;
- }
-
- /**
- * Set the tenancy catalog provider.
- */
- public void setTenantCatalogProvider(TenantCatalogProvider tenantCatalogProvider) {
- this.tenantCatalogProvider = tenantCatalogProvider;
- }
-
- /**
- * Return the PersistBatch mode to use by default at the transaction level.
- *
- * When INSERT or ALL is used then save(), delete() etc do not execute immediately but instead go into
- * a JDBC batch execute buffer that is flushed. The buffer is flushed if a query is executed, transaction ends
- * or the batch size is meet.
- */
- public PersistBatch getPersistBatch() {
- return persistBatch;
- }
-
- /**
- * Set the JDBC batch mode to use at the transaction level.
- *
- * When INSERT or ALL is used then save(), delete() etc do not execute immediately but instead go into
- * a JDBC batch execute buffer that is flushed. The buffer is flushed if a query is executed, transaction ends
- * or the batch size is meet.
- */
- public void setPersistBatch(PersistBatch persistBatch) {
- this.persistBatch = persistBatch;
- }
-
- /**
- * Return the JDBC batch mode to use per save(), delete(), insert() or update() request.
- *
- * This makes sense when a save() or delete() cascades and executes multiple child statements. The best case
- * for this is when saving a master/parent bean this cascade inserts many detail/child beans.
- *
- * This only takes effect when the persistBatch mode at the transaction level does not take effect.
- */
- public PersistBatch getPersistBatchOnCascade() {
- return persistBatchOnCascade;
- }
-
- /**
- * Set the JDBC batch mode to use per save(), delete(), insert() or update() request.
- *
- * This makes sense when a save() or delete() etc cascades and executes multiple child statements. The best caase
- * for this is when saving a master/parent bean this cascade inserts many detail/child beans.
- *
- * This only takes effect when the persistBatch mode at the transaction level does not take effect.
- */
- public void setPersistBatchOnCascade(PersistBatch persistBatchOnCascade) {
- this.persistBatchOnCascade = persistBatchOnCascade;
- }
-
- /**
- * Deprecated, please migrate to using setPersistBatch().
- *
- * Set to true if you what to use JDBC batching for persisting and deleting beans.
- *
- * With this Ebean will batch up persist requests and use the JDBC batch api.
- * This is a performance optimisation designed to reduce the network chatter.
- *
- * When true this is equivalent to {@code setPersistBatch(PersistBatch.ALL)} or
- * when false to {@code setPersistBatch(PersistBatch.NONE)}
- */
- public void setPersistBatching(boolean persistBatching) {
- this.persistBatch = (persistBatching) ? PersistBatch.ALL : PersistBatch.NONE;
- }
-
- /**
- * Return the batch size used for JDBC batching. This defaults to 20.
- */
- public int getPersistBatchSize() {
- return persistBatchSize;
- }
-
- /**
- * Set the batch size used for JDBC batching. If unset this defaults to 20.
- *
- * You can also set the batch size on the transaction.
- *
- * @see Transaction#setBatchSize(int)
- */
- public void setPersistBatchSize(int persistBatchSize) {
- this.persistBatchSize = persistBatchSize;
- }
-
- /**
- * Gets the query batch size. This defaults to 100.
- *
- * @return the query batch size
- */
- public int getQueryBatchSize() {
- return queryBatchSize;
- }
-
- /**
- * Sets the query batch size. This defaults to 100.
- *
- * @param queryBatchSize the new query batch size
- */
- public void setQueryBatchSize(int queryBatchSize) {
- this.queryBatchSize = queryBatchSize;
- }
-
- public EnumType getDefaultEnumType() {
- return defaultEnumType;
- }
-
- public void setDefaultEnumType(EnumType defaultEnumType) {
- this.defaultEnumType = defaultEnumType;
- }
-
- /**
- * Return true if lazy loading is disabled on queries by default.
- */
- public boolean isDisableLazyLoading() {
- return disableLazyLoading;
- }
-
- /**
- * Set to true to disable lazy loading by default.
- *
- * It can be turned on per query via {@link Query#setDisableLazyLoading(boolean)}.
- */
- public void setDisableLazyLoading(boolean disableLazyLoading) {
- this.disableLazyLoading = disableLazyLoading;
- }
-
- /**
- * Return the default batch size for lazy loading of beans and collections.
- */
- public int getLazyLoadBatchSize() {
- return lazyLoadBatchSize;
- }
-
- /**
- * Set the default batch size for lazy loading.
- *
- * This is the number of beans or collections loaded when lazy loading is
- * invoked by default.
- *
- * The default value is for this is 10 (load 10 beans or collections).
- *
- * You can explicitly control the lazy loading batch size for a given join on
- * a query using +lazy(batchSize) or JoinConfig.
- */
- public void setLazyLoadBatchSize(int lazyLoadBatchSize) {
- this.lazyLoadBatchSize = lazyLoadBatchSize;
- }
-
- /**
- * Set the number of sequences to fetch/preallocate when using DB sequences.
- *
- * This is a performance optimisation to reduce the number times Ebean
- * requests a sequence to be used as an Id for a bean (aka reduce network
- * chatter).
-
- */
- public void setDatabaseSequenceBatchSize(int databaseSequenceBatchSize) {
- platformConfig.setDatabaseSequenceBatchSize(databaseSequenceBatchSize);
- }
-
- /**
- * Return the default JDBC fetchSize hint for findList queries.
- */
- public int getJdbcFetchSizeFindList() {
- return jdbcFetchSizeFindList;
- }
-
- /**
- * Set the default JDBC fetchSize hint for findList queries.
- */
- public void setJdbcFetchSizeFindList(int jdbcFetchSizeFindList) {
- this.jdbcFetchSizeFindList = jdbcFetchSizeFindList;
- }
-
- /**
- * Return the default JDBC fetchSize hint for findEach/findEachWhile queries.
- */
- public int getJdbcFetchSizeFindEach() {
- return jdbcFetchSizeFindEach;
- }
-
- /**
- * Set the default JDBC fetchSize hint for findEach/findEachWhile queries.
- */
- public void setJdbcFetchSizeFindEach(int jdbcFetchSizeFindEach) {
- this.jdbcFetchSizeFindEach = jdbcFetchSizeFindEach;
- }
-
- /**
- * Return the ChangeLogPrepare.
- *
- * This is used to set user context information to the ChangeSet in the
- * foreground thread prior to the logging occurring in a background thread.
- */
- public ChangeLogPrepare getChangeLogPrepare() {
- return changeLogPrepare;
- }
-
- /**
- * Set the ChangeLogPrepare.
- *
- * This is used to set user context information to the ChangeSet in the
- * foreground thread prior to the logging occurring in a background thread.
- */
- public void setChangeLogPrepare(ChangeLogPrepare changeLogPrepare) {
- this.changeLogPrepare = changeLogPrepare;
- }
-
- /**
- * Return the ChangeLogListener which actually performs the logging of change sets
- * in the background.
- */
- public ChangeLogListener getChangeLogListener() {
- return changeLogListener;
- }
-
- /**
- * Set the ChangeLogListener which actually performs the logging of change sets
- * in the background.
- */
- public void setChangeLogListener(ChangeLogListener changeLogListener) {
- this.changeLogListener = changeLogListener;
- }
-
- /**
- * Return the ChangeLogRegister which controls which ChangeLogFilter is used for each
- * bean type and in this way provide fine grained control over which persist requests
- * are included in the change log.
- */
- public ChangeLogRegister getChangeLogRegister() {
- return changeLogRegister;
- }
-
- /**
- * Set the ChangeLogRegister which controls which ChangeLogFilter is used for each
- * bean type and in this way provide fine grained control over which persist requests
- * are included in the change log.
- */
- public void setChangeLogRegister(ChangeLogRegister changeLogRegister) {
- this.changeLogRegister = changeLogRegister;
- }
-
- /**
- * Return true if inserts should be included in the change log by default.
- */
- public boolean isChangeLogIncludeInserts() {
- return changeLogIncludeInserts;
- }
-
- /**
- * Set if inserts should be included in the change log by default.
- */
- public void setChangeLogIncludeInserts(boolean changeLogIncludeInserts) {
- this.changeLogIncludeInserts = changeLogIncludeInserts;
- }
-
- /**
- * Return true (default) if the changelog should be written async.
- */
- public boolean isChangeLogAsync() {
- return changeLogAsync;
- }
-
- /**
- * Sets if the changelog should be written async (default = true).
- */
- public void setChangeLogAsync(boolean changeLogAsync) {
- this.changeLogAsync = changeLogAsync;
- }
-
- /**
- * Return the ReadAuditLogger to use.
- */
- public ReadAuditLogger getReadAuditLogger() {
- return readAuditLogger;
- }
-
- /**
- * Set the ReadAuditLogger to use. If not set the default implementation is used
- * which logs the read events in JSON format to a standard named SLF4J logger
- * (which can be configured in say logback to log to a separate log file).
- */
- public void setReadAuditLogger(ReadAuditLogger readAuditLogger) {
- this.readAuditLogger = readAuditLogger;
- }
-
- /**
- * Return the ReadAuditPrepare to use.
- */
- public ReadAuditPrepare getReadAuditPrepare() {
- return readAuditPrepare;
- }
-
- /**
- * Set the ReadAuditPrepare to use.
- *
- * It is expected that an implementation is used that read user context information
- * (user id, user ip address etc) and sets it on the ReadEvent bean before it is sent
- * to the ReadAuditLogger.
- */
- public void setReadAuditPrepare(ReadAuditPrepare readAuditPrepare) {
- this.readAuditPrepare = readAuditPrepare;
- }
-
- /**
- * Return the configuration for profiling.
- */
- public ProfilingConfig getProfilingConfig() {
- return profilingConfig;
- }
-
- /**
- * Set the configuration for profiling.
- */
- public void setProfilingConfig(ProfilingConfig profilingConfig) {
- this.profilingConfig = profilingConfig;
- }
-
- /**
- * Return the DB schema to use.
- */
- public String getDbSchema() {
- return dbSchema;
- }
-
- /**
- * Set the DB schema to use. This specifies to use this schema for:
- *
- * When set a Calendar object is used in JDBC calls when reading/writing Timestamp objects.
- */
- public String getDataTimeZone() {
- return System.getProperty("ebean.dataTimeZone", dataTimeZone);
- }
-
- /**
- * Set the time zone to use when reading/writing Timestamps via JDBC.
- */
- public void setDataTimeZone(String dataTimeZone) {
- this.dataTimeZone = dataTimeZone;
- }
-
- /**
- * Return the suffix appended to the base table to derive the view that contains the union
- * of the base table and the history table in order to support asOf queries.
- */
- public String getAsOfViewSuffix() {
- return asOfViewSuffix;
- }
-
- /**
- * Set the suffix appended to the base table to derive the view that contains the union
- * of the base table and the history table in order to support asOf queries.
- */
- public void setAsOfViewSuffix(String asOfViewSuffix) {
- this.asOfViewSuffix = asOfViewSuffix;
- }
-
- /**
- * Return the database column used to support history and 'As of' queries. This column is a timestamp range
- * or equivalent.
- */
- public String getAsOfSysPeriod() {
- return asOfSysPeriod;
- }
-
- /**
- * Set the database column used to support history and 'As of' queries. This column is a timestamp range
- * or equivalent.
- */
- public void setAsOfSysPeriod(String asOfSysPeriod) {
- this.asOfSysPeriod = asOfSysPeriod;
- }
-
- /**
- * Return the history table suffix (defaults to _history).
- */
- public String getHistoryTableSuffix() {
- return historyTableSuffix;
- }
-
- /**
- * Set the history table suffix.
- */
- public void setHistoryTableSuffix(String historyTableSuffix) {
- this.historyTableSuffix = historyTableSuffix;
- }
-
- /**
- * Return true if we are running in a JTA Transaction manager.
- */
- public boolean isUseJtaTransactionManager() {
- return useJtaTransactionManager;
- }
-
- /**
- * Set to true if we are running in a JTA Transaction manager.
- */
- public void setUseJtaTransactionManager(boolean useJtaTransactionManager) {
- this.useJtaTransactionManager = useJtaTransactionManager;
- }
-
- /**
- * Return the external transaction manager.
- */
- public ExternalTransactionManager getExternalTransactionManager() {
- return externalTransactionManager;
- }
-
- /**
- * Set the external transaction manager.
- */
- public void setExternalTransactionManager(ExternalTransactionManager externalTransactionManager) {
- this.externalTransactionManager = externalTransactionManager;
- }
-
- /**
- * Return the ServerCachePlugin.
- */
- public ServerCachePlugin getServerCachePlugin() {
- return serverCachePlugin;
- }
-
- /**
- * Set the ServerCachePlugin to use.
- */
- public void setServerCachePlugin(ServerCachePlugin serverCachePlugin) {
- this.serverCachePlugin = serverCachePlugin;
- }
-
- /**
- * Return true if LOB's should default to fetch eager.
- * By default this is set to false and LOB's must be explicitly fetched.
- */
- public boolean isEagerFetchLobs() {
- return eagerFetchLobs;
- }
-
- /**
- * Set to true if you want LOB's to be fetch eager by default.
- * By default this is set to false and LOB's must be explicitly fetched.
- */
- public void setEagerFetchLobs(boolean eagerFetchLobs) {
- this.eagerFetchLobs = eagerFetchLobs;
- }
-
- /**
- * Return the max call stack to use for origin location.
- */
- public int getMaxCallStack() {
- return maxCallStack;
- }
-
- /**
- * Set the max call stack to use for origin location.
- */
- public void setMaxCallStack(int maxCallStack) {
- this.maxCallStack = maxCallStack;
- }
-
- /**
- * Return true if transactions should rollback on checked exceptions.
- */
- public boolean isTransactionRollbackOnChecked() {
- return transactionRollbackOnChecked;
- }
-
- /**
- * Set to true if transactions should by default rollback on checked exceptions.
- */
- public void setTransactionRollbackOnChecked(boolean transactionRollbackOnChecked) {
- this.transactionRollbackOnChecked = transactionRollbackOnChecked;
- }
-
- /**
- * Return the Background executor schedule pool size. Defaults to 1.
- */
- public int getBackgroundExecutorSchedulePoolSize() {
- return backgroundExecutorSchedulePoolSize;
- }
-
- /**
- * Set the Background executor schedule pool size.
- */
- public void setBackgroundExecutorSchedulePoolSize(int backgroundExecutorSchedulePoolSize) {
- this.backgroundExecutorSchedulePoolSize = backgroundExecutorSchedulePoolSize;
- }
-
- /**
- * Return the Background executor shutdown seconds. This is the time allowed for the pool to shutdown nicely
- * before it is forced shutdown.
- */
- public int getBackgroundExecutorShutdownSecs() {
- return backgroundExecutorShutdownSecs;
- }
-
- /**
- * Set the Background executor shutdown seconds. This is the time allowed for the pool to shutdown nicely
- * before it is forced shutdown.
- */
- public void setBackgroundExecutorShutdownSecs(int backgroundExecutorShutdownSecs) {
- this.backgroundExecutorShutdownSecs = backgroundExecutorShutdownSecs;
- }
-
- /**
- * Return the L2 cache default max size.
- */
- public int getCacheMaxSize() {
- return cacheMaxSize;
- }
-
- /**
- * Set the L2 cache default max size.
- */
- public void setCacheMaxSize(int cacheMaxSize) {
- this.cacheMaxSize = cacheMaxSize;
- }
-
- /**
- * Return the L2 cache default max idle time in seconds.
- */
- public int getCacheMaxIdleTime() {
- return cacheMaxIdleTime;
- }
-
- /**
- * Set the L2 cache default max idle time in seconds.
- */
- public void setCacheMaxIdleTime(int cacheMaxIdleTime) {
- this.cacheMaxIdleTime = cacheMaxIdleTime;
- }
-
- /**
- * Return the L2 cache default max time to live in seconds.
- */
- public int getCacheMaxTimeToLive() {
- return cacheMaxTimeToLive;
- }
-
- /**
- * Set the L2 cache default max time to live in seconds.
- */
- public void setCacheMaxTimeToLive(int cacheMaxTimeToLive) {
- this.cacheMaxTimeToLive = cacheMaxTimeToLive;
- }
-
- /**
- * Return the L2 query cache default max size.
- */
- public int getQueryCacheMaxSize() {
- return queryCacheMaxSize;
- }
-
- /**
- * Set the L2 query cache default max size.
- */
- public void setQueryCacheMaxSize(int queryCacheMaxSize) {
- this.queryCacheMaxSize = queryCacheMaxSize;
- }
-
- /**
- * Return the L2 query cache default max idle time in seconds.
- */
- public int getQueryCacheMaxIdleTime() {
- return queryCacheMaxIdleTime;
- }
-
- /**
- * Set the L2 query cache default max idle time in seconds.
- */
- public void setQueryCacheMaxIdleTime(int queryCacheMaxIdleTime) {
- this.queryCacheMaxIdleTime = queryCacheMaxIdleTime;
- }
-
- /**
- * Return the L2 query cache default max time to live in seconds.
- */
- public int getQueryCacheMaxTimeToLive() {
- return queryCacheMaxTimeToLive;
- }
-
- /**
- * Set the L2 query cache default max time to live in seconds.
- */
- public void setQueryCacheMaxTimeToLive(int queryCacheMaxTimeToLive) {
- this.queryCacheMaxTimeToLive = queryCacheMaxTimeToLive;
- }
-
- /**
- * Return the NamingConvention.
- *
- * If none has been set the default UnderscoreNamingConvention is used.
- */
- public NamingConvention getNamingConvention() {
- return namingConvention;
- }
-
- /**
- * Set the NamingConvention.
- *
- * If none is set the default UnderscoreNamingConvention is used.
- */
- public void setNamingConvention(NamingConvention namingConvention) {
- this.namingConvention = namingConvention;
- }
-
- /**
- * Return true if all DB column and table names should use quoted identifiers.
- */
- public boolean isAllQuotedIdentifiers() {
- return platformConfig.isAllQuotedIdentifiers();
- }
-
- /**
- * Set to true if all DB column and table names should use quoted identifiers.
- */
- public void setAllQuotedIdentifiers(boolean allQuotedIdentifiers) {
- platformConfig.setAllQuotedIdentifiers(allQuotedIdentifiers);
- if (allQuotedIdentifiers) {
- adjustNamingConventionForAllQuoted();
- }
- }
-
- private void adjustNamingConventionForAllQuoted() {
- if (namingConvention instanceof UnderscoreNamingConvention) {
- // we need to use matching naming convention
- this.namingConvention = new MatchingNamingConvention();
- }
- }
-
- /**
- * Return true if this Database is a Document store only instance (has no JDBC DB).
- */
- public boolean isDocStoreOnly() {
- return docStoreOnly;
- }
-
- /**
- * Set to true if this Database is Document store only instance (has no JDBC DB).
- */
- public void setDocStoreOnly(boolean docStoreOnly) {
- this.docStoreOnly = docStoreOnly;
- }
-
- /**
- * Return the configuration for the ElasticSearch integration.
- */
- public DocStoreConfig getDocStoreConfig() {
- return docStoreConfig;
- }
-
- /**
- * Set the configuration for the ElasticSearch integration.
- */
- public void setDocStoreConfig(DocStoreConfig docStoreConfig) {
- this.docStoreConfig = docStoreConfig;
- }
-
- /**
- * Return the constraint naming convention used in DDL generation.
- */
- public DbConstraintNaming getConstraintNaming() {
- return platformConfig.getConstraintNaming();
- }
-
- /**
- * Set the constraint naming convention used in DDL generation.
- */
- public void setConstraintNaming(DbConstraintNaming constraintNaming) {
- platformConfig.setConstraintNaming(constraintNaming);
- }
-
- /**
- * Return the configuration for AutoTune.
- */
- public AutoTuneConfig getAutoTuneConfig() {
- return autoTuneConfig;
- }
-
- /**
- * Set the configuration for AutoTune.
- */
- public void setAutoTuneConfig(AutoTuneConfig autoTuneConfig) {
- this.autoTuneConfig = autoTuneConfig;
- }
-
- /**
- * Return the DataSource.
- */
- public DataSource getDataSource() {
- return dataSource;
- }
-
- /**
- * Set a DataSource.
- */
- public void setDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- }
-
- /**
- * Return the read only DataSource.
- */
- public DataSource getReadOnlyDataSource() {
- return readOnlyDataSource;
- }
-
- /**
- * Set the read only DataSource.
- *
- * Note that the DataSource is expected to use AutoCommit true mode avoiding the need
- * for explicit commit (or rollback).
- *
- * This read only DataSource will be used for implicit query only transactions. It is not
- * used if the transaction is created explicitly or if the query is an update or delete query.
- */
- public void setReadOnlyDataSource(DataSource readOnlyDataSource) {
- this.readOnlyDataSource = readOnlyDataSource;
- }
-
- /**
- * Return the configuration to build a DataSource using Ebean's own DataSource
- * implementation.
- */
- public DataSourceConfig getDataSourceConfig() {
- return dataSourceConfig;
- }
-
- /**
- * Set the configuration required to build a DataSource using Ebean's own
- * DataSource implementation.
- */
- public void setDataSourceConfig(DataSourceConfig dataSourceConfig) {
- this.dataSourceConfig = dataSourceConfig;
- }
-
- /**
- * Return true if Ebean should create a DataSource for use with implicit read only transactions.
- */
- public boolean isAutoReadOnlyDataSource() {
- return autoReadOnlyDataSource;
- }
-
- /**
- * Set to true if Ebean should create a DataSource for use with implicit read only transactions.
- */
- public void setAutoReadOnlyDataSource(boolean autoReadOnlyDataSource) {
- this.autoReadOnlyDataSource = autoReadOnlyDataSource;
- }
-
- /**
- * Return the configuration for the read only DataSource.
- *
- * This is only used if autoReadOnlyDataSource is true.
- *
- * The driver, url, username and password default to the configuration for the main DataSource if they are not
- * set on this configuration. This means there is actually no need to set any configuration here and we only
- * set configuration for url, username and password etc if it is different from the main DataSource.
- */
- public DataSourceConfig getReadOnlyDataSourceConfig() {
- return readOnlyDataSourceConfig;
- }
-
- /**
- * Set the configuration for the read only DataSource.
- */
- public void setReadOnlyDataSourceConfig(DataSourceConfig readOnlyDataSourceConfig) {
- this.readOnlyDataSourceConfig = readOnlyDataSourceConfig;
- }
-
- /**
- * Return the JNDI name of the DataSource to use.
- */
- public String getDataSourceJndiName() {
- return dataSourceJndiName;
- }
-
- /**
- * Set the JNDI name of the DataSource to use.
- *
- * By default a prefix of "java:comp/env/jdbc/" is used to lookup the
- * DataSource. This prefix is not used if dataSourceJndiName starts with
- * "java:".
- */
- public void setDataSourceJndiName(String dataSourceJndiName) {
- this.dataSourceJndiName = dataSourceJndiName;
- }
-
- /**
- * Return a value used to represent TRUE in the database.
- *
- * This is used for databases that do not support boolean natively.
- *
- * The value returned is either a Integer or a String (e.g. "1", or "T").
- */
- public String getDatabaseBooleanTrue() {
- return platformConfig.getDatabaseBooleanTrue();
- }
-
- /**
- * Set the value to represent TRUE in the database.
- *
- * This is used for databases that do not support boolean natively.
- *
- * The value set is either a Integer or a String (e.g. "1", or "T").
- */
- public void setDatabaseBooleanTrue(String databaseTrue) {
- platformConfig.setDatabaseBooleanTrue(databaseTrue);
- }
-
- /**
- * Return a value used to represent FALSE in the database.
- *
- * This is used for databases that do not support boolean natively.
- *
- * The value returned is either a Integer or a String (e.g. "0", or "F").
- */
- public String getDatabaseBooleanFalse() {
- return platformConfig.getDatabaseBooleanFalse();
- }
-
- /**
- * Set the value to represent FALSE in the database.
- *
- * This is used for databases that do not support boolean natively.
- *
- * The value set is either a Integer or a String (e.g. "0", or "F").
- */
- public void setDatabaseBooleanFalse(String databaseFalse) {
- this.platformConfig.setDatabaseBooleanFalse(databaseFalse);
- }
-
- /**
- * Return the number of DB sequence values that should be preallocated.
- */
- public int getDatabaseSequenceBatchSize() {
- return platformConfig.getDatabaseSequenceBatchSize();
- }
-
- /**
- * Set the number of DB sequence values that should be preallocated and cached
- * by Ebean.
- *
- * This is only used for DB's that use sequences and is a performance
- * optimisation. This reduces the number of times Ebean needs to get a
- * sequence value from the Database reducing network chatter.
- *
- * By default this value is 10 so when we need another Id (and don't have one
- * in our cache) Ebean will fetch 10 id's from the database. Note that when
- * the cache drops to have full (which is 5 by default) Ebean will fetch
- * another batch of Id's in a background thread.
- */
- public void setDatabaseSequenceBatch(int databaseSequenceBatchSize) {
- this.platformConfig.setDatabaseSequenceBatchSize(databaseSequenceBatchSize);
- }
-
- /**
- * Return the database platform name (can be null).
- *
- * If null then the platform is determined automatically via the JDBC driver
- * information.
- */
- public String getDatabasePlatformName() {
- return databasePlatformName;
- }
-
- /**
- * Explicitly set the database platform name
- *
- * If none is set then the platform is determined automatically via the JDBC
- * driver information.
- *
- * This can be used when the Database Platform can not be automatically
- * detected from the JDBC driver (possibly 3rd party JDBC driver). It is also
- * useful when you want to do offline DDL generation for a database platform
- * that you don't have access to.
- *
- * Values are oracle, h2, postgres, mysql, sqlserver16, sqlserver17.
- */
- public void setDatabasePlatformName(String databasePlatformName) {
- this.databasePlatformName = databasePlatformName;
- }
-
- /**
- * Return the database platform to use for this database.
- */
- public DatabasePlatform getDatabasePlatform() {
- return databasePlatform;
- }
-
- /**
- * Explicitly set the database platform to use.
- *
- * If none is set then the platform is determined via the databasePlatformName
- * or automatically via the JDBC driver information.
- */
- public void setDatabasePlatform(DatabasePlatform databasePlatform) {
- this.databasePlatform = databasePlatform;
- }
-
- /**
- * Return the preferred DB platform IdType.
- */
- public IdType getIdType() {
- return platformConfig.getIdType();
- }
-
- /**
- * Set the preferred DB platform IdType.
- */
- public void setIdType(IdType idType) {
- this.platformConfig.setIdType(idType);
- }
-
- /**
- * Return the EncryptKeyManager.
- */
- public EncryptKeyManager getEncryptKeyManager() {
- return encryptKeyManager;
- }
-
- /**
- * Set the EncryptKeyManager.
- *
- * This is required when you want to use encrypted properties.
- *
- * You can also set this in ebean.proprerties:
- *
- *
- * This is optionally used to programmatically define which columns are
- * encrypted instead of using the {@link Encrypted} Annotation.
- */
- public EncryptDeployManager getEncryptDeployManager() {
- return encryptDeployManager;
- }
-
- /**
- * Set the EncryptDeployManager.
- *
- * This is optionally used to programmatically define which columns are
- * encrypted instead of using the {@link Encrypted} Annotation.
- */
- public void setEncryptDeployManager(EncryptDeployManager encryptDeployManager) {
- this.encryptDeployManager = encryptDeployManager;
- }
-
- /**
- * Return the Encryptor used to encrypt data on the java client side (as
- * opposed to DB encryption functions).
- */
- public Encryptor getEncryptor() {
- return encryptor;
- }
-
- /**
- * Set the Encryptor used to encrypt data on the java client side (as opposed
- * to DB encryption functions).
- *
- * Ebean has a default implementation that it will use if you do not set your
- * own Encryptor implementation.
- */
- public void setEncryptor(Encryptor encryptor) {
- this.encryptor = encryptor;
- }
-
- /**
- * Return true if the Database instance should be created in offline mode.
- */
- public boolean isDbOffline() {
- return dbOffline;
- }
-
- /**
- * Set to true if the Database instance should be created in offline mode.
- *
- * Typically used to create an Database instance for DDL Migration generation
- * without requiring a real DataSource / Database to connect to.
- */
- public void setDbOffline(boolean dbOffline) {
- this.dbOffline = dbOffline;
- }
-
- /**
- * Return the DbEncrypt used to encrypt and decrypt properties.
- *
- * Note that if this is not set then the DbPlatform may already have a
- * DbEncrypt set and that will be used.
- */
- public DbEncrypt getDbEncrypt() {
- return dbEncrypt;
- }
-
- /**
- * Set the DbEncrypt used to encrypt and decrypt properties.
- *
- * Note that if this is not set then the DbPlatform may already have a
- * DbEncrypt set (H2, MySql, Postgres and Oracle platforms have a DbEncrypt)
- */
- public void setDbEncrypt(DbEncrypt dbEncrypt) {
- this.dbEncrypt = dbEncrypt;
- }
-
- /**
- * Return the configuration for DB types (such as UUID and custom mappings).
- */
- public PlatformConfig getPlatformConfig() {
- return platformConfig;
- }
-
- /**
- * Set the configuration for DB platform (such as UUID and custom mappings).
- */
- public void setPlatformConfig(PlatformConfig platformConfig) {
- this.platformConfig = platformConfig;
- }
-
- /**
- * Set the DB type used to store UUID.
- */
- public void setDbUuid(PlatformConfig.DbUuid dbUuid) {
- this.platformConfig.setDbUuid(dbUuid);
- }
-
- /**
- * Returns the UUID version mode.
- */
- public UuidVersion getUuidVersion() {
- return uuidVersion;
- }
-
- /**
- * Sets the UUID version mode.
- */
- public void setUuidVersion(UuidVersion uuidVersion) {
- this.uuidVersion = uuidVersion;
- }
-
- /**
- * Return the UUID state file.
- */
- public String getUuidStateFile() {
- if (uuidStateFile == null || uuidStateFile.isEmpty()) {
- // by default, add servername...
- uuidStateFile = name + "-uuid.state";
- // and store it in the user's home directory
- String homeDir = System.getProperty("user.home");
- if (homeDir != null && homeDir.isEmpty()) {
- uuidStateFile = homeDir + "/.ebean/" + uuidStateFile;
- }
- }
- return uuidStateFile;
- }
-
- /**
- * Set the UUID state file.
- */
- public void setUuidStateFile(String uuidStateFile) {
- this.uuidStateFile = uuidStateFile;
- }
-
- /**
- * Return true if LocalTime should be persisted with nanos precision.
- */
- public boolean isLocalTimeWithNanos() {
- return localTimeWithNanos;
- }
-
- /**
- * Set to true if LocalTime should be persisted with nanos precision.
- *
- * Otherwise it is persisted using java.sql.Time which is seconds precision.
- */
- public void setLocalTimeWithNanos(boolean localTimeWithNanos) {
- this.localTimeWithNanos = localTimeWithNanos;
- }
-
- /**
- * Return true if Duration should be persisted with nanos precision (SQL DECIMAL).
- *
- * Otherwise it is persisted with second precision (SQL INTEGER).
- */
- public boolean isDurationWithNanos() {
- return durationWithNanos;
- }
-
- /**
- * Set to true if Duration should be persisted with nanos precision (SQL DECIMAL).
- *
- * Otherwise it is persisted with second precision (SQL INTEGER).
- */
- public void setDurationWithNanos(boolean durationWithNanos) {
- this.durationWithNanos = durationWithNanos;
- }
-
- /**
- * Set to true to run DB migrations on server start.
- *
- * This is the same as serverConfig.getMigrationConfig().setRunMigration(). We have added this method here
- * as it is often the only thing we need to configure for migrations.
- */
- public void setRunMigration(boolean runMigration) {
- migrationConfig.setRunMigration(runMigration);
- }
-
- /**
- * Set to true to generate the "create all" DDL on startup.
- *
- * Typically we want this on when we are running tests locally (and often using H2)
- * and we want to create the full DB schema from scratch to run tests.
- */
- public void setDdlGenerate(boolean ddlGenerate) {
- this.ddlGenerate = ddlGenerate;
- }
-
- /**
- * Set to true to run the generated "create all DDL" on startup.
- *
- * Typically we want this on when we are running tests locally (and often using H2)
- * and we want to create the full DB schema from scratch to run tests.
- */
- public void setDdlRun(boolean ddlRun) {
- this.ddlRun = ddlRun;
- }
-
- /**
- * Set to false if you not want to run the extra-ddl.xml scripts. (default = true)
- *
- * Typically we want this on when we are running tests.
- */
- public void setDdlExtra(boolean ddlExtra) {
- this.ddlExtra = ddlExtra;
- }
-
-
- /**
- * Return true if the "drop all ddl" should be skipped.
- *
- * Typically we want to do this when using H2 (in memory) as our test database and the drop statements
- * are not required so skipping the drop table statements etc makes it faster with less noise in the logs.
- */
- public boolean isDdlCreateOnly() {
- return ddlCreateOnly;
- }
-
- /**
- * Set to true if the "drop all ddl" should be skipped.
- *
- * Typically we want to do this when using H2 (in memory) as our test database and the drop statements
- * are not required so skipping the drop table statements etc makes it faster with less noise in the logs.
- */
- public void setDdlCreateOnly(boolean ddlCreateOnly) {
- this.ddlCreateOnly = ddlCreateOnly;
- }
-
- /**
- * Return SQL script to execute after the "create all" DDL has been run.
- *
- * Typically this is a sql script that inserts test seed data when running tests.
- * Place a sql script in src/test/resources that inserts test seed data.
- */
- public String getDdlSeedSql() {
- return ddlSeedSql;
- }
-
- /**
- * Set a SQL script to execute after the "create all" DDL has been run.
- *
- * Typically this is a sql script that inserts test seed data when running tests.
- * Place a sql script in src/test/resources that inserts test seed data.
- */
- public void setDdlSeedSql(String ddlSeedSql) {
- this.ddlSeedSql = ddlSeedSql;
- }
-
- /**
- * Return a SQL script to execute before the "create all" DDL has been run.
- */
- public String getDdlInitSql() {
- return ddlInitSql;
- }
-
- /**
- * Set a SQL script to execute before the "create all" DDL has been run.
- */
- public void setDdlInitSql(String ddlInitSql) {
- this.ddlInitSql = ddlInitSql;
- }
-
- /**
- * Return true if the DDL should be generated.
- */
- public boolean isDdlGenerate() {
- return ddlGenerate;
- }
-
- /**
- * Return true if the DDL should be run.
- */
- public boolean isDdlRun() {
- return ddlRun;
- }
-
- /**
- * Return true, if extra-ddl.xml should be executed.
- */
- public boolean isDdlExtra() {
- return ddlExtra;
- }
-
- /**
- * Return true if the class path search should be disabled.
- */
- public boolean isDisableClasspathSearch() {
- return disableClasspathSearch;
- }
-
- /**
- * Set to true to disable the class path search even for the case where no entity bean classes
- * have been registered. This can be used to start an Database instance just to use the
- * SQL functions such as SqlQuery, SqlUpdate etc.
- */
- public void setDisableClasspathSearch(boolean disableClasspathSearch) {
- this.disableClasspathSearch = disableClasspathSearch;
- }
-
- /**
- * Return the mode to use for Joda LocalTime support 'normal' or 'utc'.
- */
- public String getJodaLocalTimeMode() {
- return jodaLocalTimeMode;
- }
-
- /**
- * Set the mode to use for Joda LocalTime support 'normal' or 'utc'.
- */
- public void setJodaLocalTimeMode(String jodaLocalTimeMode) {
- this.jodaLocalTimeMode = jodaLocalTimeMode;
- }
-
- /**
- * Programmatically add classes (typically entities) that this server should
- * use.
- *
- * The class can be an Entity, Embedded type, ScalarType, BeanPersistListener,
- * BeanFinder or BeanPersistController.
- *
- * If no classes are specified then the classes are found automatically via
- * searching the class path.
- *
- * Alternatively the classes can be added via {@link #setClasses(List)}.
- *
- * @param cls the entity type (or other type) that should be registered by this
- * database.
- */
- public void addClass(Class> cls) {
- classes.add(cls);
- }
-
- /**
- * Register all the classes (typically entity classes).
- */
- public void addAll(List
- * This is only used if classes have not been explicitly specified.
- */
- public void addPackage(String packageName) {
- packages.add(packageName);
- }
-
- /**
- * Return packages to search for entities via class path search.
- *
- * This is only used if classes have not been explicitly specified.
- */
- public List
- * This is only used if classes have not been explicitly specified.
- */
- public void setPackages(List
- * If no classes are specified then the classes are found automatically via
- * searching the class path.
- *
- * Alternatively the classes can contain added via {@link #addClass(Class)}.
- */
- public void setClasses(List
- * This defaults to true and means that for "find by id" and "find by natural key"
- * queries that normally hit L2 bean cache automatically will not do so after a write/persist
- * on the transaction.
- *
- *
- * This mode can be explicitly set per transaction.
- *
- * @see Transaction#setUpdateAllLoadedProperties(boolean)
- */
- public void setUpdateAllPropertiesInBatch(boolean updateAllPropertiesInBatch) {
- this.updateAllPropertiesInBatch = updateAllPropertiesInBatch;
- }
-
- /**
- * Returns the resource directory.
- */
- public String getResourceDirectory() {
- return resourceDirectory;
- }
-
- /**
- * Sets the resource directory.
- */
- public void setResourceDirectory(String resourceDirectory) {
- this.resourceDirectory = resourceDirectory;
- }
-
- /**
- * Add a custom type mapping.
- *
- *
- *
- * Note alternatively you can use {@link #setQueryAdapters(List)} to set all
- * the BeanQueryAdapter instances.
- */
- public void add(BeanQueryAdapter beanQueryAdapter) {
- queryAdapters.add(beanQueryAdapter);
- }
-
- /**
- * Return the BeanQueryAdapter instances.
- */
- public List
- * Note alternatively you can use {@link #add(BeanQueryAdapter)} to add
- * BeanQueryAdapter instances one at a time.
- */
- public void setQueryAdapters(List
- * Note alternatively you can use {@link #setPersistControllers(List)} to set
- * all the BeanPersistController instances.
- */
- public void add(BeanPersistController beanPersistController) {
- persistControllers.add(beanPersistController);
- }
-
- /**
- * Register a BeanPostLoad instance.
- *
- * Note alternatively you can use {@link #setPostLoaders(List)} to set
- * all the BeanPostLoad instances.
- */
- public void add(BeanPostLoad postLoad) {
- postLoaders.add(postLoad);
- }
-
- /**
- * Register a BeanPostConstructListener instance.
- *
- * Note alternatively you can use {@link #setPostConstructListeners(List)} to set
- * all the BeanPostConstructListener instances.
- */
- public void add(BeanPostConstructListener listener) {
- postConstructListeners.add(listener);
- }
-
- /**
- * Return the list of BeanFindController instances.
- */
- public List
- * Note alternatively you can use {@link #add(BeanPersistController)} to add
- * BeanPersistController instances one at a time.
- */
- public void setPersistControllers(List
- * Note alternatively you can use {@link #setPersistListeners(List)} to set
- * all the BeanPersistListener instances.
- */
- public void add(BeanPersistListener beanPersistListener) {
- persistListeners.add(beanPersistListener);
- }
-
- /**
- * Return the BeanPersistListener instances.
- */
- public List
- * Note alternatively you can use {@link #add(BeanPersistListener)} to add
- * BeanPersistListener instances one at a time.
- */
- public void setPersistListeners(List
- * Note that this is not strongly typed as Jackson ObjectMapper is an optional dependency.
- */
- public Object getObjectMapper() {
- return objectMapper;
- }
-
- /**
- * Set the Jackson ObjectMapper.
- *
- * Note that this is not strongly typed as Jackson ObjectMapper is an optional dependency.
- */
- public void setObjectMapper(Object objectMapper) {
- this.objectMapper = objectMapper;
- }
-
- /**
- * Return true if eq("someProperty", null) should to generate "1=1" rather than "is null" sql expression.
- */
- public boolean isExpressionEqualsWithNullAsNoop() {
- return expressionEqualsWithNullAsNoop;
- }
-
- /**
- * Set to true if you want eq("someProperty", null) to generate "1=1" rather than "is null" sql expression.
- *
- * Setting this to true has the effect that eq(propertyName, value), ieq(propertyName, value) and
- * ne(propertyName, value) have no effect when the value is null. The expression factory adds a NoopExpression
- * which will add "1=1" into the SQL rather than "is null".
- */
- public void setExpressionEqualsWithNullAsNoop(boolean expressionEqualsWithNullAsNoop) {
- this.expressionEqualsWithNullAsNoop = expressionEqualsWithNullAsNoop;
- }
-
- /**
- * Return true if native ILIKE expression should be used if supported by the database platform (e.g. Postgres).
- */
- public boolean isExpressionNativeIlike() {
- return expressionNativeIlike;
- }
-
- /**
- * Set to true to use native ILIKE expression if supported by the database platform (e.g. Postgres).
- */
- public void setExpressionNativeIlike(boolean expressionNativeIlike) {
- this.expressionNativeIlike = expressionNativeIlike;
- }
-
- /**
- * Return the enabled L2 cache regions.
- */
- public String getEnabledL2Regions() {
- return enabledL2Regions;
- }
-
- /**
- * Set the enabled L2 cache regions (comma delimited).
- */
- public void setEnabledL2Regions(String enabledL2Regions) {
- this.enabledL2Regions = enabledL2Regions;
- }
-
- /**
- * Return true if L2 cache is disabled.
- */
- public boolean isDisableL2Cache() {
- return disableL2Cache;
- }
-
- /**
- * Set to true to disable L2 caching. Typically useful in performance testing.
- */
- public void setDisableL2Cache(boolean disableL2Cache) {
- this.disableL2Cache = disableL2Cache;
- }
-
- /**
- * Return true to use local only L2 cache. Effectively ignore l2 cache plugin like ebean-redis etc.
- */
- public boolean isLocalOnlyL2Cache() {
- return localOnlyL2Cache;
- }
-
- /**
- * Force the use of local only L2 cache. Effectively ignore l2 cache plugin like ebean-redis etc.
- */
- public void setLocalOnlyL2Cache(boolean localOnlyL2Cache) {
- this.localOnlyL2Cache = localOnlyL2Cache;
- }
-
- /**
- * Returns if we use javax.validation.constraints.NotNull
- */
- public boolean isUseJavaxValidationNotNull() {
- return useJavaxValidationNotNull;
- }
-
- /**
- * Controls if Ebean should ignore
- * Normally when Ebean sees javax NotNull annotation it means that column is defined as NOT NULL.
- * Set this to
- * In general we don't want to do that as when we use a distributed cache (like Ignite, Hazelcast etc)
- * we are making network calls and we prefer to do this in background and not impact the response time
- * of the executing transaction.
- */
- public void setNotifyL2CacheInForeground(boolean notifyL2CacheInForeground) {
- this.notifyL2CacheInForeground = notifyL2CacheInForeground;
- }
-
- /**
- * Return the query plan time to live.
- */
- public int getQueryPlanTTLSeconds() {
- return queryPlanTTLSeconds;
- }
-
- /**
- * Set the query plan time to live.
- */
- public void setQueryPlanTTLSeconds(int queryPlanTTLSeconds) {
- this.queryPlanTTLSeconds = queryPlanTTLSeconds;
- }
-
- /**
- * Run the DB migration against the DataSource.
- */
- public DataSource runDbMigration(DataSource dataSource) {
- if (migrationConfig.isRunMigration()) {
- MigrationRunner runner = migrationConfig.createRunner(getClassLoadConfig().getClassLoader(), properties);
- runner.run(dataSource);
- }
- return dataSource;
- }
-
- /**
- * Create a new PlatformConfig based of the one held but with overridden properties by reading
- * properties with the given path and prefix.
- *
- * Typically used in Db Migration generation for many platform targets that might have different
- * configuration for IdType, UUID, quoted identifiers etc.
- *
- * @param propertiesPath The properties path used for loading and setting properties
- * @param platformPrefix The prefix used for loading and setting properties
- * @return A copy of the PlatformConfig with overridden properties
- */
- public PlatformConfig newPlatformConfig(String propertiesPath, String platformPrefix) {
- if (properties == null) {
- properties = new Properties();
- }
- PropertiesWrapper p = new PropertiesWrapper(propertiesPath, platformPrefix, properties, classLoadConfig);
- PlatformConfig config = new PlatformConfig(platformConfig);
- config.loadSettings(p);
- return config;
- }
-
- /**
- * Add a mapping location to search for xml mapping via class path search.
- */
- public void addMappingLocation(String mappingLocation) {
- if (mappingLocations == null) {
- mappingLocations = new ArrayList<>();
- }
- mappingLocations.add(mappingLocation);
- }
-
- /**
- * Return mapping locations to search for xml mapping via class path search.
- */
- public List
- * This is only used if classes have not been explicitly specified.
- */
- public void setMappingLocations(List
- * When false we either register entity classes via application code or use classpath
- * scanning to find and register entity classes.
- */
- public boolean isAutoLoadModuleInfo() {
- return loadModuleInfo && classes.isEmpty();
- }
-
- /**
- * Set false to turn off automatic registration of entity beans.
- *
- * When using query beans that also generates a module info class that
- * can register the entity bean classes (to avoid classpath scanning).
- * This is on by default and setting this to false turns it off.
- */
- public void setLoadModuleInfo(boolean loadModuleInfo) {
- this.loadModuleInfo = loadModuleInfo;
- }
-
- public enum UuidVersion {
- VERSION4,
- VERSION1,
- VERSION1RND
- }
}
diff --git a/src/main/java/io/ebean/config/ServerConfigProvider.java b/src/main/java/io/ebean/config/ServerConfigProvider.java
index 37f05b551..f992b004d 100644
--- a/src/main/java/io/ebean/config/ServerConfigProvider.java
+++ b/src/main/java/io/ebean/config/ServerConfigProvider.java
@@ -1,11 +1,12 @@
package io.ebean.config;
/**
+ * Deprecated - migrate to DatabaseConfigProvider.
+ *
* Provides a ServiceLoader based mechanism to configure a ServerConfig.
*
* Provide an implementation and register it via the standard Java ServiceLoader mechanism
* via a file at
* If you are using a DI container like Spring or Guice you are unlikely to use this but instead use a
* spring specific configuration. When we are not using a DI container we may use this mechanism to
@@ -27,6 +28,7 @@ package io.ebean.config;
*
* }
*/
+@Deprecated
public interface ServerConfigProvider {
/**
diff --git a/src/main/java/io/ebean/dbmigration/DbMigration.java b/src/main/java/io/ebean/dbmigration/DbMigration.java
index 7bab8f7db..f27024e0a 100644
--- a/src/main/java/io/ebean/dbmigration/DbMigration.java
+++ b/src/main/java/io/ebean/dbmigration/DbMigration.java
@@ -2,7 +2,7 @@ package io.ebean.dbmigration;
import io.ebean.Database;
import io.ebean.annotation.Platform;
-import io.ebean.config.ServerConfig;
+import io.ebean.config.DatabaseConfig;
import io.ebean.config.dbplatform.DatabasePlatform;
import java.io.IOException;
@@ -88,7 +88,7 @@ public interface DbMigration {
/**
* Set the serverConfig to use. Typically this is not called explicitly.
*/
- void setServerConfig(ServerConfig config);
+ void setServerConfig(DatabaseConfig config);
/**
* Set the specific platform to generate DDL for.
diff --git a/src/main/java/io/ebean/event/ServerConfigStartup.java b/src/main/java/io/ebean/event/ServerConfigStartup.java
index a5563869e..f29b8a22a 100644
--- a/src/main/java/io/ebean/event/ServerConfigStartup.java
+++ b/src/main/java/io/ebean/event/ServerConfigStartup.java
@@ -1,6 +1,6 @@
package io.ebean.event;
-import io.ebean.config.ServerConfig;
+import io.ebean.config.DatabaseConfig;
/**
* Used to configure the server on startup.
@@ -11,8 +11,8 @@ import io.ebean.config.ServerConfig;
public interface ServerConfigStartup {
/**
- * On starting configure the ServerConfig.
+ * On starting configure the DatabaseConfig.
*/
- void onStart(ServerConfig serverConfig);
+ void onStart(DatabaseConfig config);
}
diff --git a/src/main/java/io/ebean/plugin/SpiServer.java b/src/main/java/io/ebean/plugin/SpiServer.java
index 2b55077fb..a711291b5 100644
--- a/src/main/java/io/ebean/plugin/SpiServer.java
+++ b/src/main/java/io/ebean/plugin/SpiServer.java
@@ -3,7 +3,7 @@ package io.ebean.plugin;
import io.ebean.EbeanServer;
import io.ebean.bean.BeanLoader;
import io.ebean.bean.EntityBeanIntercept;
-import io.ebean.config.ServerConfig;
+import io.ebean.config.DatabaseConfig;
import io.ebean.config.dbplatform.DatabasePlatform;
import javax.sql.DataSource;
@@ -17,7 +17,7 @@ public interface SpiServer extends EbeanServer, BeanLoader {
/**
* Return the serverConfig.
*/
- ServerConfig getServerConfig();
+ DatabaseConfig getServerConfig();
/**
* Return the DatabasePlatform for this database.
diff --git a/src/main/java/io/ebean/service/SpiContainer.java b/src/main/java/io/ebean/service/SpiContainer.java
index bf4aa4aca..547f4648e 100644
--- a/src/main/java/io/ebean/service/SpiContainer.java
+++ b/src/main/java/io/ebean/service/SpiContainer.java
@@ -1,7 +1,7 @@
package io.ebean.service;
-import io.ebean.EbeanServer;
-import io.ebean.config.ServerConfig;
+import io.ebean.Database;
+import io.ebean.config.DatabaseConfig;
/**
* Creates the Database implementations. This is used internally by the EbeanServerFactory and is not currently
@@ -14,7 +14,7 @@ public interface SpiContainer {
*
* @param configuration The configuration information for this database.
*/
- EbeanServer createServer(ServerConfig configuration);
+ Database createServer(DatabaseConfig configuration);
/**
* Create an EbeanServer just using the name.
@@ -23,7 +23,7 @@ public interface SpiContainer {
* avaje.properties file.
* {@code
+ *
+ * JedisPool jedisPool = ..
+ *
+ * serverConfig.putServiceObject(jedisPool);
+ *
+ * }
+ */
+ public void putServiceObject(Object configObject) {
+ String key = serviceObjectKey(configObject);
+ serviceObject.put(key, configObject);
+ }
+
+ private String serviceObjectKey(Object configObject) {
+ return serviceObjectKey(configObject.getClass());
+ }
+
+ private String serviceObjectKey(Class> cls) {
+ String simpleName = cls.getSimpleName();
+ return Character.toLowerCase(simpleName.charAt(0)) + simpleName.substring(1);
+ }
+
+ /**
+ * Used by plugins to obtain service objects.
+ *
+ * {@code
+ *
+ * JedisPool jedisPool = serverConfig.getServiceObject(JedisPool.class);
+ *
+ * }
+ *
+ * @param cls The type of the service object to obtain
+ * @return The service object given the class type
+ */
+ @SuppressWarnings("unchecked")
+ public
+ *
+ */
+ public void setDbSchema(String dbSchema) {
+ this.dbSchema = dbSchema;
+ }
+
+ /**
+ * Return the DB migration configuration.
+ */
+ public DbMigrationConfig getMigrationConfig() {
+ return migrationConfig;
+ }
+
+ /**
+ * Set the DB migration configuration.
+ */
+ public void setMigrationConfig(DbMigrationConfig migrationConfig) {
+ this.migrationConfig = migrationConfig;
+ }
+
+ /**
+ * Return the Geometry SRID.
+ */
+ public int getGeometrySRID() {
+ return platformConfig.getGeometrySRID();
+ }
+
+ /**
+ * Set the Geometry SRID.
+ */
+ public void setGeometrySRID(int geometrySRID) {
+ platformConfig.setGeometrySRID(geometrySRID);
+ }
+
+ /**
+ * Return the time zone to use when reading/writing Timestamps via JDBC.
+ * {@code
+ * # set via ebean.properties
+ * ebean.encryptKeyManager=org.avaje.tests.basic.encrypt.BasicEncyptKeyManager
+ * }
+ */
+ public void setEncryptKeyManager(EncryptKeyManager encryptKeyManager) {
+ this.encryptKeyManager = encryptKeyManager;
+ }
+
+ /**
+ * Return the EncryptDeployManager.
+ * {@code
+ *
+ * // assume Customer has L2 bean caching enabled ...
+ *
+ * try (Transaction transaction = DB.beginTransaction()) {
+ *
+ * // this uses L2 bean cache as the transaction
+ * // ... is considered "query only" at this point
+ * Customer.find.byId(42);
+ *
+ * // transaction no longer "query only" once
+ * // ... a bean has been saved etc
+ * DB.save(someBean);
+ *
+ * // will NOT use L2 bean cache as the transaction
+ * // ... is no longer considered "query only"
+ * Customer.find.byId(55);
+ *
+ *
+ *
+ * // explicit control - please use L2 bean cache
+ *
+ * transaction.setSkipCache(false);
+ * Customer.find.byId(77); // hit the l2 bean cache
+ *
+ *
+ * // explicit control - please don't use L2 bean cache
+ *
+ * transaction.setSkipCache(true);
+ * Customer.find.byId(99); // skips l2 bean cache
+ *
+ * }
+ *
+ * }
+ *
+ * @see Transaction#setSkipCache(boolean)
+ */
+ public boolean isSkipCacheAfterWrite() {
+ return skipCacheAfterWrite;
+ }
+
+ /**
+ * Set to false when we still want to hit the cache after a write has occurred on a transaction.
+ */
+ public void setSkipCacheAfterWrite(boolean skipCacheAfterWrite) {
+ this.skipCacheAfterWrite = skipCacheAfterWrite;
+ }
+
+ /**
+ * Returns true if updates in JDBC batch default to include all properties by default.
+ */
+ public boolean isUpdateAllPropertiesInBatch() {
+ return updateAllPropertiesInBatch;
+ }
+
+ /**
+ * Set to false if by default updates in JDBC batch should not include all properties.
+ * {@code
+ *
+ * // set the default mapping for BigDecimal.class/decimal
+ * serverConfig.addCustomMapping(DbType.DECIMAL, "decimal(18,6)");
+ *
+ * // set the default mapping for String.class/varchar but only for Postgres
+ * serverConfig.addCustomMapping(DbType.VARCHAR, "text", Platform.POSTGRES);
+ *
+ * }
+ *
+ * @param type The DB type this mapping should apply to
+ * @param columnDefinition The column definition that should be used
+ * @param platform Optionally specify the platform this mapping should apply to.
+ */
+ public void addCustomMapping(DbType type, String columnDefinition, Platform platform) {
+ platformConfig.addCustomMapping(type, columnDefinition, platform);
+ }
+
+ /**
+ * Add a custom type mapping that applies to all platforms.
+ * {@code
+ *
+ * // set the default mapping for BigDecimal/decimal
+ * serverConfig.addCustomMapping(DbType.DECIMAL, "decimal(18,6)");
+ *
+ * // set the default mapping for String/varchar
+ * serverConfig.addCustomMapping(DbType.VARCHAR, "text");
+ *
+ * }
+ *
+ * @param type The DB type this mapping should apply to
+ * @param columnDefinition The column definition that should be used
+ */
+ public void addCustomMapping(DbType type, String columnDefinition) {
+ platformConfig.addCustomMapping(type, columnDefinition);
+ }
+
+ /**
+ * Register a BeanQueryAdapter instance.
+ * &x64;javax.validation.contstraints.NotNull
+ * with respect to generating a NOT NULL column.
+ * false and the javax NotNull annotation is effectively ignored (and
+ * we instead use Ebean's own NotNull annotation or JPA Column(nullable=false) annotation.
+ */
+ public void setUseJavaxValidationNotNull(boolean useJavaxValidationNotNull) {
+ this.useJavaxValidationNotNull = useJavaxValidationNotNull;
+ }
+
+ /**
+ * Return true if L2 cache notification should run in the foreground.
+ */
+ public boolean isNotifyL2CacheInForeground() {
+ return notifyL2CacheInForeground;
+ }
+
+ /**
+ * Set this to true to run L2 cache notification in the foreground.
+ * @GeneratedValue mapping to assign
+ * Identity or Sequence generated values. When true Id properties are automatically
+ * assigned Identity or Sequence without the GeneratedValue mapping.
+ */
+ public boolean isIdGeneratorAutomatic() {
+ return idGeneratorAutomatic;
+ }
+
+ /**
+ * Set to false such that Id properties require explicit @GeneratedValue
+ * mapping before they are assigned Identity or Sequence generation based on platform.
+ */
+ public void setIdGeneratorAutomatic(boolean idGeneratorAutomatic) {
+ this.idGeneratorAutomatic = idGeneratorAutomatic;
+ }
+
+ /**
+ * Return true if query plan capture is enabled.
+ */
+ public boolean isCollectQueryPlans() {
+ return collectQueryPlans;
+ }
+
+ /**
+ * Set to true to enable query plan capture.
+ */
+ public void setCollectQueryPlans(boolean collectQueryPlans) {
+ this.collectQueryPlans = collectQueryPlans;
+ }
+
+ /**
+ * Return the query plan collection threshold in microseconds.
+ */
+ public long getCollectQueryPlanThresholdMicros() {
+ return collectQueryPlanThresholdMicros;
+ }
+
+ /**
+ * Set the query plan collection threshold in microseconds.
+ */
+ public void setCollectQueryPlanThresholdMicros(long collectQueryPlanThresholdMicros) {
+ this.collectQueryPlanThresholdMicros = collectQueryPlanThresholdMicros;
+ }
+
+ /**
+ * Return true if metrics should be dumped when the server is shutdown.
+ */
+ public boolean isDumpMetricsOnShutdown() {
+ return dumpMetricsOnShutdown;
+ }
+
+ /**
+ * Set to true if metrics should be dumped when the server is shutdown.
+ */
+ public void setDumpMetricsOnShutdown(boolean dumpMetricsOnShutdown) {
+ this.dumpMetricsOnShutdown = dumpMetricsOnShutdown;
+ }
+
+ /**
+ * Return the options for dumping metrics.
+ */
+ public String getDumpMetricsOptions() {
+ return dumpMetricsOptions;
+ }
+
+ /**
+ * Include 'sql' or 'hash' in options such that they are included in the output.
+ *
+ * @param dumpMetricsOptions Example "sql,hash", "sql"
+ */
+ public void setDumpMetricsOptions(String dumpMetricsOptions) {
+ this.dumpMetricsOptions = dumpMetricsOptions;
+ }
+
+ /**
+ * Return true if entity classes should be loaded and registered via ModuleInfoLoader.
+ * META-INF/services/io.ebean.config.ServerConfigProvider.
+ * {@code
+ *
+ * public class EbeanConfigProvider implements DatabaseConfigProvider {
+ *
+ * ï¼ Override
+ * public void apply(DatabaseConfig config) {
+ *
+ * // register the entity bean classes explicitly
+ * config.addClass(Customer.class);
+ * config.addClass(User.class);
+ * ...
+ * }
+ * }
+ *
+ * }
+ */
+public interface DatabaseConfigProvider {
+
+ /**
+ * Apply the configuration to the DatabaseConfig.
+ * {@code
- *
- * JedisPool jedisPool = ..
- *
- * serverConfig.putServiceObject(jedisPool);
- *
- * }
- */
- public void putServiceObject(Object configObject) {
- String key = serviceObjectKey(configObject);
- serviceObject.put(key, configObject);
- }
-
- private String serviceObjectKey(Object configObject) {
- return serviceObjectKey(configObject.getClass());
- }
-
- private String serviceObjectKey(Class> cls) {
- String simpleName = cls.getSimpleName();
- return Character.toLowerCase(simpleName.charAt(0)) + simpleName.substring(1);
- }
-
- /**
- * Used by plugins to obtain service objects.
- *
- * {@code
- *
- * JedisPool jedisPool = serverConfig.getServiceObject(JedisPool.class);
- *
- * }
- *
- * @param cls The type of the service object to obtain
- * @return The service object given the class type
- */
- @SuppressWarnings("unchecked")
- public
- *
- */
- public void setDbSchema(String dbSchema) {
- this.dbSchema = dbSchema;
- }
-
- /**
- * Return the DB migration configuration.
- */
- public DbMigrationConfig getMigrationConfig() {
- return migrationConfig;
- }
-
- /**
- * Set the DB migration configuration.
- */
- public void setMigrationConfig(DbMigrationConfig migrationConfig) {
- this.migrationConfig = migrationConfig;
- }
-
- /**
- * Return the Geometry SRID.
- */
- public int getGeometrySRID() {
- return platformConfig.getGeometrySRID();
- }
-
- /**
- * Set the Geometry SRID.
- */
- public void setGeometrySRID(int geometrySRID) {
- platformConfig.setGeometrySRID(geometrySRID);
- }
-
- /**
- * Return the time zone to use when reading/writing Timestamps via JDBC.
- * {@code
- * # set via ebean.properties
- * ebean.encryptKeyManager=org.avaje.tests.basic.encrypt.BasicEncyptKeyManager
- * }
- */
- public void setEncryptKeyManager(EncryptKeyManager encryptKeyManager) {
- this.encryptKeyManager = encryptKeyManager;
- }
-
- /**
- * Return the EncryptDeployManager.
- * {@code
- *
- * // assume Customer has L2 bean caching enabled ...
- *
- * try (Transaction transaction = DB.beginTransaction()) {
- *
- * // this uses L2 bean cache as the transaction
- * // ... is considered "query only" at this point
- * Customer.find.byId(42);
- *
- * // transaction no longer "query only" once
- * // ... a bean has been saved etc
- * DB.save(someBean);
- *
- * // will NOT use L2 bean cache as the transaction
- * // ... is no longer considered "query only"
- * Customer.find.byId(55);
- *
- *
- *
- * // explicit control - please use L2 bean cache
- *
- * transaction.setSkipCache(false);
- * Customer.find.byId(77); // hit the l2 bean cache
- *
- *
- * // explicit control - please don't use L2 bean cache
- *
- * transaction.setSkipCache(true);
- * Customer.find.byId(99); // skips l2 bean cache
- *
- * }
- *
- * }
- *
- * @see Transaction#setSkipCache(boolean)
- */
- public boolean isSkipCacheAfterWrite() {
- return skipCacheAfterWrite;
- }
-
- /**
- * Set to false when we still want to hit the cache after a write has occurred on a transaction.
- */
- public void setSkipCacheAfterWrite(boolean skipCacheAfterWrite) {
- this.skipCacheAfterWrite = skipCacheAfterWrite;
- }
-
- /**
- * Returns true if updates in JDBC batch default to include all properties by default.
- */
- public boolean isUpdateAllPropertiesInBatch() {
- return updateAllPropertiesInBatch;
- }
-
- /**
- * Set to false if by default updates in JDBC batch should not include all properties.
- * {@code
- *
- * // set the default mapping for BigDecimal.class/decimal
- * serverConfig.addCustomMapping(DbType.DECIMAL, "decimal(18,6)");
- *
- * // set the default mapping for String.class/varchar but only for Postgres
- * serverConfig.addCustomMapping(DbType.VARCHAR, "text", Platform.POSTGRES);
- *
- * }
- *
- * @param type The DB type this mapping should apply to
- * @param columnDefinition The column definition that should be used
- * @param platform Optionally specify the platform this mapping should apply to.
- */
- public void addCustomMapping(DbType type, String columnDefinition, Platform platform) {
- platformConfig.addCustomMapping(type, columnDefinition, platform);
- }
-
- /**
- * Add a custom type mapping that applies to all platforms.
- * {@code
- *
- * // set the default mapping for BigDecimal/decimal
- * serverConfig.addCustomMapping(DbType.DECIMAL, "decimal(18,6)");
- *
- * // set the default mapping for String/varchar
- * serverConfig.addCustomMapping(DbType.VARCHAR, "text");
- *
- * }
- *
- * @param type The DB type this mapping should apply to
- * @param columnDefinition The column definition that should be used
- */
- public void addCustomMapping(DbType type, String columnDefinition) {
- platformConfig.addCustomMapping(type, columnDefinition);
- }
-
- /**
- * Register a BeanQueryAdapter instance.
- * &x64;javax.validation.contstraints.NotNull
- * with respect to generating a NOT NULL column.
- * false and the javax NotNull annotation is effectively ignored (and
- * we instead use Ebean's own NotNull annotation or JPA Column(nullable=false) annotation.
- */
- public void setUseJavaxValidationNotNull(boolean useJavaxValidationNotNull) {
- this.useJavaxValidationNotNull = useJavaxValidationNotNull;
- }
-
- /**
- * Return true if L2 cache notification should run in the foreground.
- */
- public boolean isNotifyL2CacheInForeground() {
- return notifyL2CacheInForeground;
- }
-
- /**
- * Set this to true to run L2 cache notification in the foreground.
- * @GeneratedValue mapping to assign
- * Identity or Sequence generated values. When true Id properties are automatically
- * assigned Identity or Sequence without the GeneratedValue mapping.
- */
- public boolean isIdGeneratorAutomatic() {
- return idGeneratorAutomatic;
- }
-
- /**
- * Set to false such that Id properties require explicit @GeneratedValue
- * mapping before they are assigned Identity or Sequence generation based on platform.
- */
- public void setIdGeneratorAutomatic(boolean idGeneratorAutomatic) {
- this.idGeneratorAutomatic = idGeneratorAutomatic;
- }
-
- /**
- * Return true if query plan capture is enabled.
- */
- public boolean isCollectQueryPlans() {
- return collectQueryPlans;
- }
-
- /**
- * Set to true to enable query plan capture.
- */
- public void setCollectQueryPlans(boolean collectQueryPlans) {
- this.collectQueryPlans = collectQueryPlans;
- }
-
- /**
- * Return the query plan collection threshold in microseconds.
- */
- public long getCollectQueryPlanThresholdMicros() {
- return collectQueryPlanThresholdMicros;
- }
-
- /**
- * Set the query plan collection threshold in microseconds.
- */
- public void setCollectQueryPlanThresholdMicros(long collectQueryPlanThresholdMicros) {
- this.collectQueryPlanThresholdMicros = collectQueryPlanThresholdMicros;
- }
-
- /**
- * Return true if metrics should be dumped when the server is shutdown.
- */
- public boolean isDumpMetricsOnShutdown() {
- return dumpMetricsOnShutdown;
- }
-
- /**
- * Set to true if metrics should be dumped when the server is shutdown.
- */
- public void setDumpMetricsOnShutdown(boolean dumpMetricsOnShutdown) {
- this.dumpMetricsOnShutdown = dumpMetricsOnShutdown;
- }
-
- /**
- * Return the options for dumping metrics.
- */
- public String getDumpMetricsOptions() {
- return dumpMetricsOptions;
- }
-
- /**
- * Include 'sql' or 'hash' in options such that they are included in the output.
- *
- * @param dumpMetricsOptions Example "sql,hash", "sql"
- */
- public void setDumpMetricsOptions(String dumpMetricsOptions) {
- this.dumpMetricsOptions = dumpMetricsOptions;
- }
-
- /**
- * Return true if entity classes should be loaded and registered via ModuleInfoLoader.
- * META-INF/services/io.ebean.config.ServerConfigProvider.
- *