2011-07-28 19 views
0

我將我們的項目從spring 2.5.6,hibernate 3.3.2,jboss 4.2升級到Spring 3..0.5 + hierbnate 3.6 .6.final + jboss as 7Spring 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"; 
    } 
} 

吾道inferface:

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 

好像休眠不承認我的實體。由於我的實體是使用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豆)

<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 CONFI standalone.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> 

任何幫助或暗示的讚賞。

謝謝

安德魯

+0

我在這裏添加更多細節,以便原始帖子不會太長。 1. Jboss AS 7擁有hibernate 4作爲其jpa模塊。我在我的項目中添加了「jboss-deployment-structure.xml」來排除hibernate 4,因爲我使用的是hibernate 3.6.6.final – yzandrew

+0

2.我編輯standalone.xml中的數據源,並通過jndi將它綁定到我的EntityManagerFactory擡頭。 3.我可以看到,我在調試時初始化了entityManager。 – yzandrew

回答

1

什麼jpa-persistence.xml樣子?

您需要列出要與EntityManager with a <class> element映射的類。

+0

jpa-persistence.xml文件沒有做太多的事情,只是指定了「hibernate.dialect」屬性。 – yzandrew

+0

但我沒有元素在我以前的項目和項目工作正常。 – yzandrew

+0

相同的源代碼和配置? –

2

同時發佈全班。錯誤基本上是說jpa無法找到你的班級。

+0

我有4班。 Web控制器(調用dao類方法),DAO接口,DAO impl和實體。我會將它們發佈在原始帖子中 – yzandrew

3

@yzandrew:如果您不想在persistence.xml中添加每個實體類,它需要屬性'packagesToScan'用於實體管理器工廠bean。

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

其實你甚至不需要persistence.xml中,但如果你希望走這條路它依賴。