我现在正在使用 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 文件的存在!
提前致谢 :)