Example usage for org.hibernate.boot MetadataSources getAnnotatedClasses

List of usage examples for org.hibernate.boot MetadataSources getAnnotatedClasses

Introduction

In this page you can find the example usage for org.hibernate.boot MetadataSources getAnnotatedClasses.

Prototype

public Collection<Class<?>> getAnnotatedClasses() 

Source Link

Usage

From source file:org.jooq.meta.extensions.jpa.JPADatabase.java

License:Apache License

@Override
protected DSLContext create0() {
    if (connection == null) {
        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");
        }/*from w  ww . ja v a  2s. com*/

        // [#9058] Properties use camelCase notation.
        boolean useAttributeConverters = Boolean.valueOf(getProperties().getProperty("useAttributeConverters",
                getProperties().getProperty("use-attribute-converters", "true")));
        String unqualifiedSchema = getProperties().getProperty("unqualifiedSchema", "none").toLowerCase();
        publicIsDefault = "none".equals(unqualifiedSchema);

        try {
            Properties info = new Properties();
            info.put("user", "sa");
            info.put("password", "");
            connection = new org.h2.Driver().connect("jdbc:h2:mem:jooq-meta-extensions-" + UUID.randomUUID(),
                    info);

            // [#6709] Apply default settings first, then allow custom overrides
            Map<String, Object> 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<Object, Object> entry : getProperties().entrySet()) {
                String key = "" + entry.getKey();

                if (key.startsWith("hibernate.") || key.startsWith("javax.persistence."))
                    userSettings.put(key, entry.getValue());
            }
            settings.putAll(userSettings);

            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder();
            builder.applySettings(settings);

            MetadataSources metadata = new MetadataSources(builder.applySettings(settings).build());

            ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(
                    true);

            scanner.addIncludeFilter(new AnnotationTypeFilter(Entity.class));

            // [#5845] Use the correct ClassLoader to load the jpa entity classes defined in the user project
            ClassLoader cl = Thread.currentThread().getContextClassLoader();

            for (String pkg : packages.split(","))
                for (BeanDefinition def : scanner.findCandidateComponents(defaultIfBlank(pkg, "").trim()))
                    metadata.addAnnotatedClass(Class.forName(def.getBeanClassName(), true, cl));

            // This seems to be the way to do this in idiomatic Hibernate 5.0 API
            // See also: http://stackoverflow.com/q/32178041/521799
            // SchemaExport export = new SchemaExport((MetadataImplementor) metadata.buildMetadata(), connection);
            // export.create(true, true);

            // Hibernate 5.2 broke 5.0 API again. Here's how to do this now:
            SchemaExport export = new SchemaExport();
            export.create(EnumSet.of(TargetType.DATABASE), metadata.buildMetadata());

            if (useAttributeConverters)
                loadAttributeConverters(metadata.getAnnotatedClasses());
        } catch (Exception e) {
            throw new DataAccessException("Error while exporting schema", e);
        }
    }

    return DSL.using(connection);
}