Проблема с JPA2 и Hibernate - PullRequest
1 голос
/ 28 июня 2011

У меня есть эта проблема:

 Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: fb-persistence] Unable to configure EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:378)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
    at it.synclab.fb.test.Test.main(Test.java:13)
Caused by: java.lang.ClassCastException: org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass
    at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:209)
    at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:200)
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2061)
    at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4008)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3962)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1371)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1348)
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1522)
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1100)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:282)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:366)
    ... 4 more

Кто может помочь мне решить? Я настроил Hibernate с JPA, файл persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="fb-persistence" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>it.synclab.fb.jpa.Plugin</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>  
            <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>  
            <property name="hibernate.show_sql" value="true"/> 
            <property name="hibernate.connection.username" value="***"/>  
            <property name="hibernate.connection.password" value="***"/>
            <property name="hibernate.connection.url" value="jdbc:oracle:thin:@localhost:1521:RAFFAELE"/>
        </properties>
   </persistence-unit>
</persistence>

и мой класс с отображением:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity @Table(name="PLUGIN")
public class Plugin {

    private int id;


    private String nome;


    private String descrizione;


    public Plugin(){}

    @Id
    @Column(name="ID")
    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }

    @Column(name="NOME")
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Column(name="DESCRIZIONE")
    public String getDescrizione() {
        return descrizione;
    }

    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Plugin other = (Plugin) obj;
        if (id != other.id)
            return false;
        return true;
    }
}

В чем проблема? Помоги мне? Я забыл, я настроил зависимость с Maven2 и файл pom.xml:

...
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>3.6.3.Final</version>
        </dependency>
       <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
        </dependency>
...

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 октября 2011

Раньше я получал эту ошибку при наличии бинов сущностей, унаследованных друг от друга. Несмотря на то, что они были аннотированы (в соответствии со спецификациями JPA2), они не работали в Hibernate (существует множество таких ошибок с реализацией Hibernate JPA2). Наконец, я добавил очень специфическую (хотя и не обязательную с точки зрения JPA2) конфигурацию (с помощью аннотаций) для столбца дискриминатора (@DiscriminatorValue("SomeValue")), столбцов, используемых для соединений (@PrimaryKeyJoinColumn(name = "idColumn")). Из вашего фрагмента кода не видно, что вы используете наследование, но если это так, попробуйте.

Кроме того, если ваш проект позволяет это, переключитесь с Hibernate на Eclipselink в качестве реализации JPA2. У меня было бесчисленное множество случаев, когда правильный код JPA2 работал в EclipseLink, но в Hibernate возникали странные исключения.

0 голосов
/ 28 июня 2011

Могу поспорить, что на вашем пути к классам есть несколько банок гибернации, и поэтому он вызывает исключение приведения класса.

Другой бит, который выглядит неправильно (но может быть правильным), - это то, что вы используете транзакции JTA. Если вы не знаете, что означает JTA, измените тип транзакции в файле persistance.xml на transaction-type="RESOURCE_LOCAL"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...