web-dev-qa-db-fra.com

org.hibernate.MappingException: entité inconnue:

Je veux vraiment comprendre ce qui se passe avec mon code.

J'ai une application autonome qui utilise Spring et Hibernate en tant que JPA et j'essaie d'exécuter le test avec une seule classe principale.

Ma classe principale

package edu.acct.tsegay.common;

import edu.acct.tsegay.model.User;
import edu.acct.tsegay.business.IUserBusinessObject;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        try {
            ApplicationContext context = new ClassPathXmlApplicationContext(
                    "Spring3AndHibernate-servlet.xml");
            IUserBusinessObject userBusinessObject = (IUserBusinessObject) context
                    .getBean("userBusiness");

            User user = (User) context.getBean("user1");
            user.setPassword("pass");
            user.setUsername("tsegay");
            System.out.println(user.getPassword());

            userBusinessObject.delete(user);

            User user2 = new User();
            user2.setUsername("habest");
            user2.setPassword("pass1");
            System.out.println(user2.getPassword());
            /*
             * userBusinessObject.save(user2);
             * 
             * User user3 = userBusinessObject.searchUserbyId("tsegay");
             * System.out.println("Search Result: " + user3.getUsername());
             */
            System.out.println("Success");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

mon contexte d'application est:

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <!-- data source -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test" />
        <property name="username" value="test" />
        <property name="password" value="password" />
    </bean>

    <!-- session factory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

        <property name="dataSource">
            <ref bean="dataSource" />

        </property>

        <property name="hibernateProperties">

            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>



    </bean>

    <!-- exposed person business object -->
    <bean id="userBusiness" class="edu.acct.tsegay.business.UserBusinessObject">
        <property name="userDao" ref="userDao" />

    </bean>
    <bean id="user1" class="edu.acct.tsegay.model.User">
        <property name="username" value="tse" />
        <property name="password" value="pass" />
    </bean>


    <!-- Data Access Object -->
    <bean id="userDao" class="edu.acct.tsegay.dao.UserDao">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>


</beans>

Mon modèle d'utilisateur est:

package edu.acct.tsegay.model;

import Java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;

import org.hibernate.annotations.NaturalId;

@Entity
public class User implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String username;
    private String password;
    private Integer VERSION;

    @Version
    public Integer getVERSION() {
        return VERSION;
    }

    public void setVERSION(Integer vERSION) {
        VERSION = vERSION;
    }
    @NaturalId
    public String getUsername() {
        return username;
    }


    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

Mon DAO est:

package edu.acct.tsegay.dao;

import edu.acct.tsegay.model.User;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao implements IUserDao {
    private SessionFactory sessionFactory;

    private HibernateTemplate hibernateTemplate;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
        this.hibernateTemplate = new HibernateTemplate(sessionFactory);
    }

    public void save(User user) {
        // TODO Auto-generated method stub
        // getHibernateTemplate().save(user);
        this.hibernateTemplate.save(user);
    }

    public void delete(User user) {
        // TODO Auto-generated method stub
        this.hibernateTemplate.delete(user);
    }

    public User searchUserbyId(String username) {
        // TODO Auto-generated method stub
        return this.hibernateTemplate.get(User.class, username);
    }

}

Et ceci mon erreur stacktrace quand j'exécute le programme:

pass
org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: edu.acct.tsegay.model.User; nested exception is org.hibernate.MappingException: Unknown entity: edu.acct.tsegay.model.User
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.Java:679)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.Java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.Java:411)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.Java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.Java:837)
    at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.Java:833)
    at edu.acct.tsegay.dao.UserDao.delete(UserDao.Java:34)
    at edu.acct.tsegay.business.UserBusinessObject.delete(UserBusinessObject.Java:30)
    at edu.acct.tsegay.common.App.main(App.Java:23)
Caused by: org.hibernate.MappingException: Unknown entity: edu.acct.tsegay.model.User
    at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.Java:580)
    at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.Java:1365)
    at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.Java:100)
    at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.Java:74)
    at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.Java:793)
    at org.hibernate.impl.SessionImpl.delete(SessionImpl.Java:771)
    at org.springframework.orm.hibernate3.HibernateTemplate$25.doInHibernate(HibernateTemplate.Java:843)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.Java:406)
    ... 6 more
12
tkt986

Vous devez répertorier vos classes dans la configuration de votre usine de session. Vous pouvez faire que vos entités soient auto-découvertes si vous utilisez EntityManager.

Pour utiliser les annotations avec Hibernate et Spring, vous devez utiliser AnnotationSessionFactoryBean:

 <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="annotatedClasses">
        <list>
            <value>edu.acct.tsegay.model.User</value>
        </list>
    </property>
    ....
 </bean>

En outre, il est plutôt étrange que votre entité User soit un haricot de printemps. Tu n'as pas besoin de ça. Les entités Hibernate sont supposées être créées avec l'opérateur new

26
Bozho

J'ai rencontré le même problème et je n'ai trouvé aucune bonne réponse à cette question.

Ce qui a fonctionné pour moi a été de déclarer ma classe d'entité dans le fichier persistence.xml:

<persistence ...>
    <persistence-unit ...>

        <class>com.company.maenad.core.model.News</class>
        <class>com.company.maenad.core.model.AdExtraInfo</class>

    </persistence-unit>
</persistence>
3
Gal Bracha

En plus de Bozho answer, si vous utilisez spring + hibernate avec une annotation, alors dans votre bean d'usine de session, vous pouvez enregistrer votre bean comme ci-dessous:

LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(appContext.getBean(HikariDataSource.class));
localSessionFactoryBean.setAnnotatedClasses(
        AppUser.class, Assignment.class
);
0
Vishrant