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?
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/