Hibernate 4.1 Ошибка: не удалось создать DynamicParameterizedType для типа: org.hibernate.type.EnumType

Я пытаюсь обновить свой проект с спящего режима 3.6 до 4.1.6, я думаю, что все банки находятся в нужном месте, ... и т. д., но теперь у меня есть это исключение ниже, поиск в Google не дал ответа. Мой код отлично работает в Hibernate 3.6, и я не уверен, что это проблема с моими сопоставлениями или что-то еще. Я настраиваю спящий режим 4.1 с Spring 3.1.2, используя подход JPA.

Caused by: org.hibernate.MappingException: Could not create DynamicParameterizedType for type: org.hibernate.type.EnumType
        at org.hibernate.mapping.SimpleValue.createParameterImpl(SimpleValue.java:398)
        at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:304)
        at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:294)
        at org.hibernate.mapping.Property.isValid(Property.java:238)
        at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:469)
        at org.hibernate.mapping.RootClass.validate(RootClass.java:270)
        at org.hibernate.cfg.Configuration.validate(Configuration.java:1294)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1738)
        at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
        ... 55 more
    Caused by: java.lang.ClassNotFoundException: char
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:192)
        at org.hibernate.mapping.SimpleValue.createParameterImpl(SimpleValue.java:389)
        ... 64 more

Обновление: я поставил точки останова в коде гибернации, где перехватывается это исключение, и нашел сопоставление, которое ему не нравится, вот оно ниже.

@Entity
@Table(name = "company_addresses")
public class CompanyAddress extends TimeStampedPersistableObject
{
public enum AddressType
{
    PUBLIC('p'), SHAREHOLDER('s');

    private final char typeCode;

    AddressType(char typeCode)
    {
        this.typeCode = typeCode;
    }

    public static AddressType parse(char c)
    {
        for (AddressType addressType : AddressType.values())
        {
            if (addressType.value() == c)
            {
                return addressType;
            }
        }
        return null;
    }

    public char value()
    {
        return typeCode;
    }
}

@Column(name = "address_type")
@Enumerated(EnumType.STRING)
private char type;

person ams    schedule 29.08.2012    source источник
comment
Есть ли BeanCreationException или что-то в этом роде?   -  person Oleksandr Bondarenko    schedule 29.08.2012
comment
nope no noBeanCreationException, два исключения над нижней частью трассировки стека   -  person ams    schedule 29.08.2012
comment
Не могли бы вы опубликовать класс, в котором вы используете org.hibernate.type.EnumType?   -  person Oleksandr Bondarenko    schedule 29.08.2012
comment
Ваши сопоставленные классы были бы здесь несколько полезны.   -  person Matt    schedule 29.08.2012
comment
Я включил полную трассировку, я даже не могу перейти в спящий режим, чтобы распечатать, какое сопоставление вызывает проблемы. У меня более 50 сущностей, и я не могу понять, какая из них вызывает проблему.   -  person ams    schedule 29.08.2012
comment
см. обновления, мне удалось найти сопоставление, которое ему не нравится, которое отлично работает с Hibernate 3.6.10.   -  person ams    schedule 29.08.2012


Ответы (1)


Оказалось, что у меня был лишний @Enumerated, который спящий режим 3.6 игнорировал, что сбивало с толку спящий режим 4.1.

@Column(name = "address_type")
@Enumerated(EnumType.STRING)
private char type;

Я забыл @Enumerated в этом поле, которое имеет тип char, но сеттеры и геттеры используют правильный Enum. Удаление @Enumerated устранило проблему, которая была ошибкой в ​​моем отображении.

В Hibernate 4.1 не удалось указать имя таблицы и имя столбца, из-за чего было немного сложно определить, какое сопоставление вызывает проблему.

person ams    schedule 29.08.2012