在Spring应用程序中使用非Spring Hibernate JPA DAO类

时间:2014-08-11 17:31:20

标签: java spring hibernate jpa

我有一个带有Hibernate JPA持久层的Maven项目,我想将其合并到一些Spring应用程序中(一个是Web应用程序,另一个是命令行工具),但我不确定如何配置它。持久性模块包括模型类,DAO类和persistence.xml文件。我已将Spring的EntityManagerFactory配置为使用现有的persistence.xml,但实例化DAO类始终会生成NullPointerException,因为它们似乎无法按名称找到持久性单元。是否可以在Spring应用程序中使用在Spring的上下文之外创建的Hibernate JPA类?

的persistence.xml

<persistence-unit name="myapp" transaction-type="RESOURCE_LOCAL">
    <properties>
        <property name="hibernate.archive.autodetection" value="class, hbm" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />
        <property name="hibernate.show_sql" value="false" />

    </properties>
</persistence-unit>

应用context.xml中

<bean id="allProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="singleton" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:config/db.properties</value>
            <value>classpath:config/log4j.properties</value>
        </list>
    </property>
</bean>

<context:component-scan base-package="com.company.app" />

<context:annotation-config />

<bean id="entityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
    <property name="persistenceUnitName" value="myapp"/>
    <property name="dataSource" ref="datasource" />
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    <property name="jpaDialect" ref="jpaDialect"/>
</bean>

<bean id="jpaVendorAdapter" 
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="MYSQL" />
    <property name="databasePlatform" value="${hibernate.dialect}" />
</bean>

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="dataSource" ref="datasource" />
    <property name="jpaDialect" ref="jpaDialect" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="${hibernate.connection.url}" />
    <property name="username" value="${hibernate.connection.username}" />
    <property name="password" value="${hibernate.connection.password}" />
</bean>

UserDao.java

public class UserDao extends AbstractDao<User> {
public UserDao() {
    super("myapp");
}
// CRUD methods

AbstractDao.java

public abstract class AbstractDao<T extends DataObject> {
private EntityManagerFactory emf;
private final static Logger log = LoggerFactory.getLogger(AbstractDao.class);
private final Map<String, Map<String, String>> connectionDictionaries =
    new HashMap<String, Map<String, String>>();


public AbstractDao(String dataSourceName) {
  try {
    setUpDataSource(dataSourceName);
  } catch (IOException e) {
    log.error("Unable to load: ", AbstractDataConstants.DB_PROPERTIES_FILE);
    e.printStackTrace();
  }
}
...
// Other methods

0 个答案:

没有答案