Spring 3..0.5 + hierbnate 3.6.6.final + jboss as 7 Доступ к базе данных
Я обновляю наши проекты с весны 2.5.6, hibernate 3.3.2, jboss 4.2 до Spring 3..0.5 + hierbnate 3.6.6.final + jboss как 7.
Там было много проблем, и я решил написать простой проект и начать его на jboss as7(с Spring 3..0.5 + hierbnate 3.6.6.final) в начале. Проект очень прост: класс DAO будет обращаться к базе данных MYSQL. Но приложение завершается неудачно, когда его entityManager пытается получить доступ к БД, выбрасывая "исключение выбросило: org.hibernate.MappingException: Unknown entity".
Ниже мой проект:
Мой класс веб-контроллеров:
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
Кажется, что спящий не узнает мою сущность. Поскольку моя сущность генерируется с помощью инструментов 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 (который в основном определяет bean-компонент 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>
Любая помощь или советы приветствуются.
Спасибо
Эндрю
3 ответа
@yzandrew: для компонента управления фабрикой диспетчера сущностей требуется свойство packagesToScan, если вы не хотите добавлять каждый класс сущности в файл persistence.xml.
<property name="packagesToScan" value="path/to/package"/>
На самом деле вам даже не нужен файл persistence.xml, но это зависит от того, хотите ли вы идти по этому пути.
Также опубликовать весь класс. Ошибка в основном говорит о том, что jpa не может найти ваш класс.