1

プロジェクトを hibernate 3.6 から 4.1.6 にアップグレードしようとしています。すべての jar が適切な場所にあると思います...などですが、グーグルの下にこの例外があり、答えが得られませんでした。私のコードは Hibernate 3.6 で正常に動作しますが、これが私のマッピングの問題なのか、それとも何か他の問題なのかわかりません。JPA アプローチを使用して、Spring 3.1.2 で hibernate 4.1 を構成しています。

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;
4

1 に答える 1

1

hibernate 3.6が無視していた追加の@Enumeratedがあり、hibernate 4.1を混乱させていたことが判明しました

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

char 型を持つこのフィールドの @Enumerated を忘れていましたが、セッターとゲッターは適切な Enum を使用していました。@Enumerated を削除すると問題が修正されました。これは私のマッピングのバグでした。

Hibernate 4.1 は、テーブルの名前と列の名前を示すことができなかったため、問題の原因となっているマッピングを特定するのが少し難しくなりました。

于 2012-08-29T18:27:38.167 に答える