【问题标题】:org.hibernate.MappingException: Unknown entity:org.hibernate.MappingException:未知实体:
【发布时间】:2010-12-25 14:59:57
【问题描述】:

我真的很想了解我的代码发生了什么。

我有一个使用 spring 和 Hibernate 作为 JPA 的独立应用程序,我正在尝试使用单个主类运行测试

我的主要课程

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();
        }

    }

}

我的应用程序上下文是:

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

我的用户模型是:

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

}

我的 DAO 是:

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);
    }

}

这是我运行程序时的堆栈跟踪错误:

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

【问题讨论】:

  • 我在你的 spring 配置中没有看到注释扫描器,例如
  • 是的,我需要添加上下文命名空间并添加该配置。让我试试。谢谢

标签: java hibernate spring


【解决方案1】:

您必须在会话工厂配置中列出您的类。如果您使用EntityManager,则可以自动发现您的实体。

为了在hibernate和spring中使用注解,你必须使用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>

另外,你的User 实体是一个spring bean,这很奇怪。你不需要那个。 Hibernate 实体应该使用new 运算符创建。

【讨论】:

  • 我正在考虑这样做,我如何列出会话工厂配置中的类。
  • 感谢更新,我现在收到此错误 org.hibernate.AnnotationException: No identifier specified for entity: edu.acct.tsegay.model.User
  • 我修复了上面的错误。我使用@NaturalId 作为标识符,然后更改为@Id。现在它工作正常。
  • 如果你已经在 hibernate.cfg.xml 中配置了 session facory,那么在这里也添加映射。
【解决方案2】:

我遇到了同样的问题,没有找到任何好的答案

对我有用的是在 persistence.xml 文件中声明我的实体类:

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

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

    </persistence-unit>
</persistence>

【讨论】:

  • 我已经为“org.hibernate.MappingException: Unknown entity”苦苦挣扎了好几个小时,试图理解为什么我对“packagesToScan”的定义(在 entityManager 下)没有找到我的实体,现在在添加之后它对我的 persistence.xml 它就像一个魅力!!!
【解决方案3】:

除了 Bozho 的回答之外,如果您使用带有注释的 spring + hibernate,那么您可以在会话工厂 bean 中注册您的 bean,如下所示:

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

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 2011-11-28
    • 2014-04-16
    • 2012-12-04
    • 2014-08-05
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多