javajpaeclipselinkauto-generate

eclipselink JPA error - can't find class java.util.Setjava.time.DayOfWeek


I have an entity, with the following field:

    @Column(name="DAYS_BITMAP", length=7)
    @Convert(converter=DaysOfWeekSetToStringConverter.class)
    private Set<DayOfWeek> daysRunning;

I then have the converter as follows:

import java.time.DayOfWeek;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = false)
public class DaysOfWeekSetToStringConverter implements AttributeConverter<Set<DayOfWeek>, String>
{

    @Override
    public String convertToDatabaseColumn(Set<DayOfWeek> attribute) {
        char[] result = "0000000".toCharArray();
        for (DayOfWeek dow : attribute)
        {
            result[dow.getValue()-1] = '1';
        }
        return new String(result);
    }

    @Override
    public Set<DayOfWeek> convertToEntityAttribute(String dbData) {
        Set<DayOfWeek> results = new HashSet<>();
        char[] daysOfWeekMonToSun = dbData.toCharArray();
        for (int i=0;i<7;i++) // 7 days in a week
        {
            if (daysOfWeekMonToSun[i] == '1')
            {
                results.add(DayOfWeek.of(i+1)); // days of week are indexed 1 = Monday, 7 = Sunday
            }
        }
        return results;
    }
}

When I come to ask eclipselink to generate the DDL for me, it does it - but it throws this error:

EL Fine]: server: Configured server platform: org.eclipse.persistence.platform.server.NoServerPlatform
[EL Fine]: metadata: java.lang.ClassNotFoundException: java.util.Setjava.time.DayOfWeek
    at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory.getVirtualMetadataClass(MetadataAsmFactory.java:542)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory.buildClassMetadata(MetadataAsmFactory.java:143)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory.getMetadataClass(MetadataAsmFactory.java:177)
    at org.eclipse.persistence.internal.jpa.metadata.ORMetadata.getMetadataClass(ORMetadata.java:408)
    at org.eclipse.persistence.internal.jpa.metadata.ORMetadata.getMetadataClass(ORMetadata.java:400)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ConverterAccessor.initClassificationClasses(ConverterAccessor.java:179)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ConverterAccessor.<init>(ConverterAccessor.java:85)
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.initPersistenceUnitClasses(MetadataProcessor.java:378)
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processEntityMappings(MetadataProcessor.java:563)
    at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:625)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:2001)
    at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:104)
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:107)
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:191)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.buildEntityManagerFactory(Main.java:94)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.execute(Main.java:80)
    at org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.main(Main.java:68)

How can I help eclipselink to find the class it needs?


Solution

  • You need to use the raw type Set rather than the specific Generic version. See also https://www.eclipse.org/forums/index.php/t/1103966/