0

我现在正在使用 Spring 3.1 和 JPA 2.0 开发一个项目,我收到一条日志消息错误,告诉我:“没有名为 manager1 的 EntityManager 的持久性提供程序”。

这是我的 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>

这是我的托管实体“Operation.java”:package 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”替代 Spring 3.1 中的“ApplicationContext.xml”:

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 文件的存在!

提前致谢 :)

4

1 回答 1

0

您必须在 emf 中设置要直接扫描的包,并设置持久性单元名称:

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

在此之后,您甚至不再需要persistence.xml。

我还建议(如果您无论如何都摆脱了 persistence.xml)为基本属性使用正确的 jpa 属性:

javax.persistence.jdbc.driver
javax.persistence.jdbc.url
javax.persistence.jdbc.user
javax.persistence.jdbc.password
于 2012-09-04T01:35:01.130 回答