2013-10-27 7 views
5

Ich wollte die neue JPA 2.1-Funktion verwenden, um einen benutzerdefinierten generischen Enum-Konverter zu erstellen. Aber bei der Bereitstellung bekomme ich diesen Fehler: Caused by: org.hibernate.AssertionFailure: Could not extract ParameterizedType representation of AttributeConverter definition from AttributeConverter implementation class [de.lukaseichler.pomodoro.task.entity.converter.PriorityConverter] Die ParameterizedType-Darstellung der AttributeConverter-Definition konnte nicht extrahiert werden

Ich benutze Hibernate 4.3.0 auf Wildfly 8.0.0.Beta1 mit JPA 2.1. Mache ich etwas aus oder ist das ein Fehler im Winterschlaf?

Enumconverter.java

public abstract class EnumConverter<T extends Enum> implements AttributeConverter<T, String> { 

private Class<T> type; 

@Override 
public String convertToDatabaseColumn(T attribute) { 
    return attribute.name(); 
} 

@Override 
public T convertToEntityAttribute(String name) { 
    if (type == null) { 
     getType(); 
    } 
    return (T)Enum.valueOf(type, name); 
} 

private void getType() { 
    Class<?> converterClass = getClass(); 
    while (true) { 
     Class<?> baseClass = converterClass.getSuperclass(); 
     assert baseClass != null : "Converter must be derived from " + EnumConverter.class.getName(); 

     if (baseClass == EnumConverter.class) { 
      break; 
     } 

     converterClass = baseClass; 
    } 

    Type genericSuperClass = converterClass.getGenericSuperclass(); 
    assert genericSuperClass instanceof ParameterizedType : EnumConverter.class.getName() + "must be generic"; 

    Type[] typeParms = ((ParameterizedType) genericSuperClass).getActualTypeArguments(); 
    assert typeParms.length == 2 : EnumConverter.class.getName() + " must have 2 type parameters but has " + typeParms.length; 

    Type enumType = typeParms[1]; 

    if(enumType instanceof ParameterizedType) { 
     enumType = ((ParameterizedType) enumType).getRawType(); 
    } 

    assert enumType instanceof Enum<?> : "Entity must be a enum type"; 

    type = (Class<T>) enumType; 
} 

}

PriorityConverter.java

@Converter(autoApply = true) 
public class PriorityConverter extends EnumConverter<Priority>{ 
} 

Priority.java

public enum Priority { 
NONE, LOW, NORMAL, HIGH, TOP; 
} 
+0

Können Sie bitte Ihre Projektkonfiguration veröffentlichen, einschließlich Hibernate und JPA API-Versionen? – chrylis

+0

Ich verwende Hibernate 4.3.0 auf Wildfly 8.0.0.Beta1 mit JPA 2.1 –

+0

[Der entsprechende Code ist hier] (https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src /main/java/org/hibernate/cfg/AttributeConverterDefinition.java). Hibernate 4.3.0 ist noch Beta; Bitte bestätigen Sie, dass Sie die neueste Version verwenden (Beta5, denke ich). – chrylis

Antwort

6

Als Abhilfe können Sie tun:

@Converter(autoApply = true) 
    public class PriorityConverter extends EnumConverter<Priority> 
         implements AttributeConverter<Priority, String> {} 

Dieser Hibernate Fehler bei berichtet: https://hibernate.atlassian.net/browse/HHH-8854

Verwandte Themen