[jboss-jira] [JBoss JIRA] (HIBERNATE-174) NullPointerException at rg.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassDescriptor - Hibernate 6.0.0.Alpha4

Victor Williams Stafusa da Silva (Jira) issues at jboss.org
Tue Apr 7 05:47:00 EDT 2020


Victor Williams Stafusa da Silva created HIBERNATE-174:
----------------------------------------------------------

             Summary: NullPointerException at rg.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassDescriptor - Hibernate 6.0.0.Alpha4
                 Key: HIBERNATE-174
                 URL: https://issues.redhat.com/browse/HIBERNATE-174
             Project: Hibernate Integration
          Issue Type: Bug
            Reporter: Victor Williams Stafusa da Silva
            Assignee: Steve Ebersole


This code works fine in Hibernate 5.4.13.Final, but gives a NullPointerException at Hibernate 6.0.0.Alpha4:

Test file:

{code:title=Hbug.java|borderStyle=solid}
package com.example;

import java.net.URL;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.PersistenceProviderImpl;
import org.eclipse.persistence.jpa.JpaEntityManagerFactory;
import org.hibernate.SessionFactory;
import org.hibernate.jpa.HibernatePersistenceProvider;

/**
 * @author Victor Williams Stafusa da Silva
 */
public class Hbug {

    public static void main(String[] args) {
        List.<TestSomething>of(Hbug::testHibernate, Hbug::testEclipselink, Hbug::testOpenJpa)
                .forEach(TestSomething::outer);
    }

    private interface TestSomething {
        public void inner() throws Exception;

        public default void outer() {
            try {
                inner();
                System.out.println("Ok");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static void testHibernate() throws Exception {
        Map<String, String> props = new HashMap<>();
        props.put("javax.persistence.jdbc.user", "sa");
        props.put("javax.persistence.jdbc.password", "");
        props.put("javax.persistence.jdbc.url", "jdbc:hsqldb:mem:test1");
        props.put("hibernate.hbm2ddl.import_files_sql_extractor", "org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor");
        props.put("javax.persistence.schema-generation.database.action", "drop-and-create");

        Set<Class<?>> entities = new HashSet<>();
        entities.add(Fruit.class);

        String pu = "test-1";

        javax.persistence.spi.PersistenceProvider pp = new HibernatePersistenceProvider();
        var spui = new SimplePersistenceUnitInfo(Optional.empty(), HibernatePersistenceProvider.class, pu, entities, props);
        var emf = pp.createContainerEntityManagerFactory(spui, props);
        if (!(emf instanceof SessionFactory)) throw new Exception("Bad EMF");
    }

    private static void testEclipselink() throws Exception {
        Map<String, String> props = new HashMap<>();
        props.put("javax.persistence.jdbc.user", "sa");
        props.put("javax.persistence.jdbc.password", "");
        props.put("javax.persistence.jdbc.url", "jdbc:hsqldb:mem:test1");
        props.put("javax.persistence.schema-generation.database.action", "drop-and-create");

        Set<Class<?>> entities = new HashSet<>();
        entities.add(Fruit.class);

        String pu = "test-1";

        javax.persistence.spi.PersistenceProvider pp = new org.eclipse.persistence.jpa.PersistenceProvider();
        var spui = new SimplePersistenceUnitInfo(Optional.of(new URL("http://0.0.0.0/")), pp.getClass(), pu, entities, props);
        var emf = pp.createContainerEntityManagerFactory(spui, props);
        if (!(emf instanceof JpaEntityManagerFactory)) throw new Exception("Bad EMF");
    }

    private static void testOpenJpa() throws Exception {
        Map<String, String> props = new HashMap<>();
        props.put("javax.persistence.jdbc.user", "sa");
        props.put("javax.persistence.jdbc.password", "");
        props.put("javax.persistence.jdbc.url", "jdbc:hsqldb:mem:test1");
        props.put("javax.persistence.jdbc.driver", "org.hsqldb.jdbc.JDBCDriver");
        props.put("javax.persistence.schema-generation.database.action", "drop-and-create");
        props.put("openjpa.DynamicEnhancementAgent", "true");
        props.put("openjpa.RuntimeUnenhancedClasses", "supported");

        Set<Class<?>> entities = new HashSet<>();
        entities.add(Fruit.class);

        String pu = "test-1";

        javax.persistence.spi.PersistenceProvider pp = new PersistenceProviderImpl();
        var spui = new SimplePersistenceUnitInfo(Optional.empty(), pp.getClass(), pu, entities, props);
        var emf = pp.createContainerEntityManagerFactory(spui, props);
        if (!(emf instanceof OpenJPAEntityManagerFactory)) throw new Exception("Bad EMF");
    }
}
{code}

Utilitary class used by the above one:

{code:title=SimplePersistenceUnitInfo.java|borderStyle=solid}
package com.example;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.stream.Collectors;
import javax.persistence.SharedCacheMode;
import javax.persistence.ValidationMode;
import javax.persistence.spi.ClassTransformer;
import javax.persistence.spi.PersistenceProvider;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;

/**
 * @author Victor Williams Stafusa da Silva
 */
public final class SimplePersistenceUnitInfo implements PersistenceUnitInfo {

    private final Optional<URL> url;
    private final Class<? extends PersistenceProvider> providerClass;
    private final String persistenceUnitName;
    private final List<String> classes;
    private final Map<String, String> properties;

    public SimplePersistenceUnitInfo(
            /*@NonNull*/ Optional<URL> url,
            /*@NonNull*/ Class<? extends PersistenceProvider> providerClass,
            /*@NonNull*/ String persistenceUnitName,
            /*@NonNull*/ Collection<Class<?>> classes,
            /*@NonNull*/ Map<String, String> properties)
    {
        this.url = url;
        this.providerClass = providerClass;
        this.persistenceUnitName = persistenceUnitName;
        this.classes = classes.stream().map(Class::getName).collect(Collectors.toList());
        this.properties = new HashMap<>();
        this.properties.putAll(properties);
    }

    @Override
    public String getPersistenceUnitName() {
        return persistenceUnitName;
    }

    @Override
    public String getPersistenceProviderClassName() {
        return providerClass.getName();
    }

    @Override
    public PersistenceUnitTransactionType getTransactionType() {
        return PersistenceUnitTransactionType.RESOURCE_LOCAL;
    }

    @Override
    //@Nullable
    public DataSource getJtaDataSource() {
        return null;
    }

    @Override
    //@Nullable
    public DataSource getNonJtaDataSource() {
        return null;
    }

    @Override
    public List<String> getMappingFileNames() {
        return Collections.emptyList();
    }

    @Override
    public List<URL> getJarFileUrls() {
        try {
            return Collections.list(this.getClass().getClassLoader().getResources(""));
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    //@Nullable
    @Override
    public URL getPersistenceUnitRootUrl() {
        return url.orElse(null);
    }

    @Override
    public List<String> getManagedClassNames() {
        return Collections.unmodifiableList(classes);
    }

    @Override
    public boolean excludeUnlistedClasses() {
        return false;
    }

    @Override
    public SharedCacheMode getSharedCacheMode() {
        return SharedCacheMode.UNSPECIFIED;
    }

    @Override
    public ValidationMode getValidationMode() {
        return ValidationMode.AUTO;
    }

    @Override
    public Properties getProperties() {
        Properties p = new Properties();
        p.putAll(properties);
        return p;
    }

    @Override
    public String getPersistenceXMLSchemaVersion() {
        return "2.2";
    }

    @Override
    //@Nullable
    public ClassLoader getClassLoader() {
        return Thread.currentThread().getContextClassLoader();
    }

    @Override
    public void addTransformer(ClassTransformer transformer) {
    }

    @Override
    //@Nullable
    public ClassLoader getNewTempClassLoader() {
        return null;
    }
}
{code}

Sample entity class:

{code:title=Fruit.java|borderStyle=solid}
package com.example;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @author Victor Williams Stafusa da Silva
 */
@Entity
@Table(name = "fruits")
public class Fruit implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private String color;

    public Fruit() {}

    public Fruit(String name, String color) {
        this.name = name;
        this.color = color;
    }

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }
}
{code}

Gradle script to build that:

{code:title=build.gradle|borderStyle=solid}
apply plugin: 'java'
apply plugin: 'application'

group = 'com.example'

mainClassName = 'com.example.Hbug'

repositories {
    jcenter()
}

dependencies {
    implementation 'org.hsqldb:hsqldb:2.5.0'
    //implementation 'org.hibernate:hibernate-core:5.4.13.Final'
    implementation 'org.hibernate.orm:hibernate-core:6.0.0.Alpha4'
}
{code}



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the jboss-jira mailing list