【问题标题】:Spring 3..0.5 + hierbnate 3.6.6.final + jboss as 7 Database accessSpring 3..0.5 + hierbnate 3.6.6.final + jboss as 7 数据库访问
【发布时间】:2011-07-28 01:13:02
【问题描述】:

我正在将我们的项目从 spring 2.5.6、hibernate 3.3.2、jboss 4.2 升级到 Spring 3..0.5 + hierbnate 3.6.6.final + jboss as 7

那里有很多问题,一开始我决定写一个简单的项目并在 jboss as7(使用 Spring 3..0.5 + hierbnate 3.6.6.final)上部署它。该项目非常简单:一个 DAO 类将访问 MYSQL 数据库。但是当它的 entityManager 尝试访问数据库时应用程序失败,抛出“抛出异常:org.hibernate.MappingException:未知实体”。

下面是我的项目:

我的网络控制器类:

package com.yan.testing.web.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yan.testing.jpa.dao.IYanDao;
import com.yan.testing.jpa.entity.Yan;

@Controller
public class WebController {

    @Autowired
    IYanDao yanDao;

    @RequestMapping("sayHello.do")
    public String SayHello(){
        Yan yan = yanDao.findById(1L);
        System.out.println(yan.getName());
        return "sayHello";
    }
}

我的 DAO 接口:

package com.yan.testing.jpa.dao;

import com.yan.testing.jpa.entity.Yan;

public interface IYanDao {
    Yan findById(Long id);
}

在我的 DAO 课程中:

package com.yan.testing.jpa.dao.impl;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import com.yan.testing.jpa.dao.IYanDao;
import com.yan.testing.jpa.entity.Yan;

@Repository(value="yanDao")
public class YanDao implements IYanDao{

    private EntityManager entityManager;
    @PersistenceContext 
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public Yan findById(Long id){
        return entityManager.find(Yan.class, id);
    }
}

问题来了: "entityManager.find(Yan.class, id);"抛出异常:

Servlet.service() for servlet spring threw exception: org.hibernate.MappingException: Unknown entity: com.yan.testing.jpa.entity.Yan

似乎 hibernate 无法识别我的实体。由于我的实体是使用 Jboss 工具生成的,因此在我的实体类中找不到任何错误。

下面是我的实体类:

package com.yan.testing.jpa.entity;

// default package
// Generated Jul 27, 2011 4:15:52 PM by Hibernate Tools 3.4.0.CR1

import static javax.persistence.GenerationType.IDENTITY;

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

/**
 * Yan generated by hbm2java
 */

@Entity
@Table(name = "yan", catalog = "fuhu_app_submission")
public class Yan implements java.io.Serializable {

    private static final long serialVersionUID = -6812001362936479032L;
    private Integer objId;
    private String name;

    public Yan() {
    }

    public Yan(String name) {
        this.name = name;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "obj_id", unique = true, nullable = false)
    public Integer getObjId() {
        return this.objId;
    }

    public void setObjId(Integer objId) {
        this.objId = objId;
    }

    @Column(name = "name", length = 45)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

以下是我的应用程序和 jboss 为 7 的配置:

applicationContext.xml(基本上定义了一个 entityManagerFactory bean)

<context:component-scan base-package="com.yan.testing"/> 
<context:annotation-config/>

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:jboss/datasources/MySqlDS" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceXmlLocation" value="classpath*:META-INF/jpa-persistence.xml"/>   
    <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="false" />
            </bean>
    </property>
</bean>    
<tx:annotation-driven />

jpa-persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="1.0"
    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_1_0.xsd">

    <persistence-unit name="app_sub_jpa">
        <description>Hibernate for JPA</description>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        </properties>
    </persistence-unit>
</persistence>

我的 jboss confistandalone.xml:

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/MySqlDS" pool-name="MySqlDS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
                    <connection-url>
                        jdbc:mysql://127.0.0.1:3306/my_schema
                    </connection-url>
                    <driver>
                        com.mysql
                    </driver>
                    <transaction-isolation>
                        TRANSACTION_READ_COMMITTED
                    </transaction-isolation>
                    <security>
                        <user-name>
                            root
                        </user-name>
                        <password>
                            root
                        </password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>
                            32
                        </prepared-statement-cache-size>
                    </statement>
                </datasource>
                <drivers>
                    <driver name="com.mysql" module="com.mysql">
                        <xa-datasource-class>
                            com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
                        </xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>

感谢任何帮助或提示。

谢谢

安德鲁

【问题讨论】:

  • 我在这里添加更多细节,这样原帖就不会太长了。 1. Jboss AS 7 有 hibernate 4 作为它的 jpa 模块。我在我的项目中添加了“jboss-deployment-structure.xml”以排除hibernate 4,因为我使用的是hibernate 3.6.6.final
  • 2.我已经编辑了standalone.xml 中的数据源,并通过jndi 查找将它绑定到我的EntityManagerFactory。 3.我调试的时候可以看到entityManager被初始化了。

标签: java hibernate spring jpa jboss


【解决方案1】:

@yzandrew:如果您不想在 persistence.xml 中添加每个实体类,它需要实体管理器工厂 bean 的属性“packagesToScan”。

<property name="packagesToScan" value="path/to/package"/>

实际上你甚至不需要persistence.xml,但这取决于你是否想走这条路。

【讨论】:

    【解决方案2】:

    同时发布整个班级。错误基本上是说jpa找不到你的类。

    【讨论】:

    • 我有 4 节课。 Web 控制器(调用 dao 类方法)、DAO 接口、DAO 实现和实体。我会将它们全部发布到原始帖子中
    【解决方案3】:

    jpa-persistence.xml 长什么样子?

    您需要列出要使用 EntityManager with a &lt;class&gt; element 映射的类。

    【讨论】:

    • jpa-persistence.xml 文件没有做太多事情,只是指定了“hibernate.dialect”属性。
    • 但我之前的项目中没有 元素,并且项目运行良好。
    • 酷。看来我必须将&lt;class&gt;com.yan.testing.jpa.entity.Yan&lt;/class&gt; 添加到我的 jpa-persistence.xml 中。但奇怪的是,在我之前的项目中,是没有必要的。
    • 我不能说有相同的配置,因为有不同的环境。但基本上,是的。它们基本相同。我一开始就在我的旧项目中列出了&lt;Class&gt; 元素。然后将它们删除,因为用 @entity 注释实体类会让 JPA 知道它是一个实体。
    • 类文件中的@Entity 本身不会让JPA 知道该实体。 EntityManager(和/或 Hibernate)仍然需要被告知您对映射感兴趣的类。
    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 2012-04-01
    • 2012-01-30
    • 2011-12-15
    • 2013-10-31
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    相关资源
    最近更新 更多