2012-09-02 73 views
0

我现在正在使用Spring 3.1和JPA 2.0的项目工作,我收到一条日志消息错误告诉我:“否持久性提供程序对于名为manager1的EntityManager“。“No Persistence provider for EntityManager named manager1”错误与JPA 2.0和Spring 3.1

这里是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 
<persistence-unit name="DemoSpringCore" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>app.demo.model.Operation</class> 
    <properties> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3309/test"/> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.connection.username" value="root"/> 
     <property name="hibernate.connection.password" value="root"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
     <property name="hibernate.show_sql" value="true"/> 
    </properties> 
</persistence-unit> 

这里是我的管理enity “Operation.java”: 包app.demo.model;

import java.io.Serializable; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="operation") 
public class Operation implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 

@Column(name="a",length=9) 
private int a; 

@Column(name="b",length=9) 
private int b; 

@Column(name="c",length=10) 
private int c; 

public int getA() { 
    return a; 
} 
public void setA(int a) { 
    this.a = a; 
} 
public int getB() { 
    return b; 
} 
public void setB(int b) { 
    this.b = b; 
} 
public int getC() { 
    return c; 
} 
public void setC(int c) { 
    this.c = c; 
} 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
} 

这里是我的Java配置文件 “AppConfiguration.java” “的applicationContext.xml” 的春季3.1替代:

package app.demo.config; 

import java.util.Properties; 
import com.jolbox.bonecp.BoneCPDataSource; 
import javax.annotation.Resource; 
import javax.sql.DataSource; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.ImportResource; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.core.env.Environment; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import app.demo.dao.OperationDAO; 
import app.demo.dao.OperationDAOImpl; 
import app.demo.service.OperationServiceImpl; 
import app.demo.service.OperationService; 
import org.hibernate.ejb.HibernatePersistence; 

@Configuration 
@PropertySource("/META-INF/application.properties") 
public class AppConfiguration { 

private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; 
private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; 
private static final String PROPERTY_NAME_DATABASE_URL = "db.url"; 
private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; 

private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql"; 
private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan"; 
// private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = 
// "hibernate.ejb.naming_strategy"; 

@Resource 
private Environment environment; 

@Bean(name = "operationServiceBean") 
public OperationService operationService() { 
    return new OperationServiceImpl(); 
} 

@Bean(name = "operationDAOBean") 
public OperationDAO operationDAO() { 
    return new OperationDAOImpl(); 
} 

@Bean 
public DataSource dataSource() { 

    BoneCPDataSource dataSource = new BoneCPDataSource(); 

    dataSource.setDriverClass(environment 
      .getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); 
    dataSource.setJdbcUrl(environment 
      .getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); 
    dataSource.setUsername(environment 
      .getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); 
    dataSource.setPassword(environment 
      .getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); 

    return (DataSource) dataSource; 
} 

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() 
     throws ClassNotFoundException { 
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 

    entityManagerFactoryBean 
      .setPersistenceProviderClass(HibernatePersistence.class); 

    entityManagerFactoryBean.setDataSource(dataSource()); 

    Properties jpaProterties = new Properties(); 
    jpaProterties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment 
      .getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
    jpaProterties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment 
      .getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL)); 
    jpaProterties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment 
      .getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); 
    jpaProterties 
      .put(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN, 
        environment 
          .getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN)); 
    // jpaProterties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, 
    // environment 
    // .getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY)); 
    entityManagerFactoryBean.setJpaProperties(jpaProterties); 

    return entityManagerFactoryBean; 
} 
} 

,最后我的 “application.properties” 这里我把数据源连接属性:

db.driver=com.mysql.jdbc.Driver 
db.url=jdbc:mysql://localhost:3309/test 
db.username=root 
db.password=root 

hibernate.dialect=org.hibernate.dialect.MySQLDialect 
hibernate.format_sql=true 
hibernate.show_sql=true 

entitymanager.packages.to.scan=app.demo.model 

PS:我用两种方法“appliaction.properties”,也是“persistence.xml中”每一个单独和后两者在同一时间,我希望这会工作,但没有任何事情发生! 此外,我在“AppConfiguration.java”和“persistence.xml”中都添加了提供者属性,并验证了所有依赖关系jar文件的存在!

感谢提前:)

+1

可能重复HTTP ://stackoverflow.com/questions/1158159/no-persistence-provider-for-entitymanager-named) – 2012-09-02 10:23:12

+0

谢谢老兄,就是这样:) – ayoubuntu

回答

0

您必须设置包直接在EMF进行扫描,并设置了持久化单元名称:

entityManagerFactoryBean.setPackagesToScan(...); 
entityManagerFactoryBean.setPersistenceUnitName(...); 

在这之后,你甚至不需要持久性.xml了。

此外,我会建议(如果您得到反正摆脱persistence.xml中的)使用正确的JPA属性的基本要点:

javax.persistence.jdbc.driver 
javax.persistence.jdbc.url 
javax.persistence.jdbc.user 
javax.persistence.jdbc.password 
[为EntityManager的不持久性提供者命名(的