org.jooq.meta.extensions.jpa.JPADatabase Maven / Gradle / Ivy
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Other licenses:
* -----------------------------------------------------------------------------
* Commercial licenses for this work are available. These replace the above
* Apache-2.0 license and offer limited warranties, support, maintenance, and
* commercial database integrations.
*
* For more information, please visit: http://www.jooq.org/licenses
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package org.jooq.meta.extensions.jpa;
import static org.jooq.tools.StringUtils.defaultIfBlank;
import static org.jooq.tools.StringUtils.isBlank;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Entity;
import org.jooq.Name;
import org.jooq.SQLDialect;
import org.jooq.impl.JPAConverter;
import org.jooq.meta.extensions.AbstractInterpretingDatabase;
import org.jooq.meta.h2.H2Database;
import org.jooq.meta.jaxb.ForcedType;
import org.jooq.tools.JooqLogger;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter;
/**
* The JPA database.
*
* This jOOQ-meta schema source works on an undisclosed in-memory
* {@link H2Database}, which is constructed from a set of JPA-annotated entities
* using Spring and Hibernate:
*
*
* - Spring discovers all the JPA-annotated entities in the comma-separated
* list of
packages
(configured in the code generator)
* - Those entities are passed to Hibernate's {@link SchemaExport} to generate
* an empty database schema in the in-memory H2 database
* - A jOOQ {@link H2Database} is used to reverse-engineer this schema
* again
*
*
* @author Lukas Eder
*/
public class JPADatabase extends AbstractInterpretingDatabase {
static final String HIBERNATE_DIALECT = SQLDialect.H2.thirdParty().hibernateDialect();
static final JooqLogger log = JooqLogger.getLogger(JPADatabase.class);
Map userSettings = new HashMap<>();
@Override
protected void export() throws Exception {
String packages = getProperties().getProperty("packages");
if (isBlank(packages)) {
packages = "";
log.warn("No packages defined", "It is highly recommended that you provide explicit packages to scan");
}
// [#9058] Properties use camelCase notation.
boolean useAttributeConverters = Boolean.parseBoolean(
getProperties().getProperty("useAttributeConverters",
getProperties().getProperty("use-attribute-converters", "true")
)
);
// [#6709] Apply default settings first, then allow custom overrides
Map settings = new LinkedHashMap<>();
settings.put("hibernate.dialect", HIBERNATE_DIALECT);
settings.put("javax.persistence.schema-generation-connection", connection());
settings.put("javax.persistence.create-database-schemas", true);
// [#5607] JPADatabase causes warnings - This prevents them
settings.put(AvailableSettings.CONNECTION_PROVIDER, connectionProvider());
for (Entry
© 2015 - 2025 Weber Informatics LLC | Privacy Policy