Spring数据Jpa JavaConfig

时间:2014-08-27 17:02:45

标签: jpa spring-data

我最近使用弹簧数据jpa在弹簧网络应用程序上工作

我遇到持久性配置问题:

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "com.servmed")
@PropertySource({ "/resources/hibernate.properties" })
@EnableJpaRepositories(basePackages = "com.servmed.repositories")

public class PersistenceConfig {

    @Autowired
    private Environment env;


    Properties jpaProperties() {
        return new Properties() {
            {
                setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
                setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); //allows Hibernate to generate SQL optimized for a particular relational database.
                setProperty("hibernate.show_sql",env.getProperty("hibernate.show_sql"));
            }
        };
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory()
    {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setShowSql(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setDataSource(dataSource());
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setJpaProperties(jpaProperties());
        factory.setPackagesToScan("com.servmed.models");

        //factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
        return factory;
    }

    @Bean
    public PlatformTransactionManager transactionManager()
    {
        EntityManagerFactory factory = entityManagerFactory().getObject();
        return new JpaTransactionManager(factory);
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator(){
        return new HibernateExceptionTranslator();
    }


    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));

        return dataSource;
    }
}

我收到此错误,我似乎无法找到错误:

Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/servmed/configuration/PersistenceConfig.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory]]

PS:我注意到我添加到库中的hibernate实体管理器已被取消,我应该用其他东西替换吗?

3 个答案:

答案 0 :(得分:0)

不完全确定问题是什么,但我相信您的实体经理定义可能会在某处被破坏。

我使用的这个定义非常接近你的定义。看看。

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
    emf.setDataSource(this.dataSource());
    emf.setPackagesToScan("com.servmed.models");
    emf.setPersistenceUnitName("MyPU");
    HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter();
    emf.setJpaVendorAdapter(va);
    Properties jpaProperties = new Properties();
    jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
    jpaProperties.put("hibernate.hbm2ddl.auto", "create");
    emf.setJpaProperties(jpaProperties);
    emf.afterPropertiesSet();
    return emf;
}

答案 1 :(得分:-1)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:property-placeholder location="classpath:datasource.properties" />

    <context:annotation-config/> 
    <context:component-scan base-package="com.wish.anthem.hippa" />

    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.wish.anthem.hippa.model" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${jpa.showSql}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            </props>
        </property>
    </bean>     

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

     <!--   <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean> --> 

    <bean id="jdbctemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="dataSource"></property>  
    </bean>  

    <!--  <tx:annotation-driven  /> -->

    <!--  <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> -->

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1" />
        <property name="ignoreAcceptHeader" value="true" />
        <property name="mediaTypes">
            <map>
                <entry key="xml"  value="application/xml"/> 
                <entry key="json" value="application/json"/>
            </map>
        </property>
    </bean>   
</beans>

jpa.database=MYSQL
jpa.showSql=false

hibernate.hbm2ddl.auto=update
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/anthem
jdbc.username=root
jdbc.password=

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>anthem</display-name>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>dispatcherservlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherservlet</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dispatcherservlet-servlet.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

</web-app><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>anthem</display-name>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>dispatcherservlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherservlet</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dispatcherservlet-servlet.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

</web-app>

<jsp:forward page="anthemlogin.htm" />

@SuppressWarnings("unchecked")
@Repository
public class CatalogDaoImpl implements CatalogDao 
{
    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    @Transactional
    public List<Catalog> getAllCatalogs()  
    {
        Session session = sessionFactory.openSession();     
        Query query = session.createQuery("select c from Catalog c");
        List<Catalog> catalogs = query.list();
        session.close();
        return catalogs;            
    }
}

@Entity
@Table(name = "h_product")
public class Product implements Serializable
{

    private static final long serialVersionUID = 353305417649482096L;


    @Id
    @GeneratedValue
    @Column(name = "ProductID", nullable = false)
    private Integer productID = 0;

    @Column(name = "ProductItem", nullable = false, length = 50)
    private String productItem = "";

    @Column(name = "ProductName", nullable = false, length = 50)
    private String productName = "";

    @Column(name="Title", nullable=false, length=50)
    private String title = "";

    @Column(name = "CreateTime", nullable = false, length = 19)
    private Date createTime = Utils.getCurrentDateTimeDate();


    public Integer getProductID() {
        return productID;
    }

    public void setProductID(Integer productID) {
        this.productID = productID;
    }

    public String getProductItem() {
        return productItem;
    }

    public void setProductItem(String productItem) {
        this.productItem = productItem;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }


    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((productID == null) ? 0 : productID.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Product other = (Product) obj;
        if (productID == null)
        {
            if (other.productID != null)
                return false;
        }
        else if (!productID.equals(other.productID))
            return false;
        return true;
    }
}

@Component

public class HippaServiceImpl implements HippaService
{
    @Autowired
    private HippaDao catalogDao;
}

答案 2 :(得分:-1)

    @Controller
    public class HippaController 
    {

        final static Logger logger = Logger.getLogger(HippaController.class);

        @Autowired
        private HippaService hippaService;


        @RequestMapping(value="/anthemlogin", method = RequestMethod.GET)
        public String showLoginPage(HttpServletRequest request,HttpSession session)
        {
            logger.info("Home Page!!!!!!!!");

            return "home";
        }

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

        <context:property-placeholder location="classpath:datasource.properties" />

        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
            destroy-method="close">
            <property name="driverClass" value="${jdbc.driverClassName}" />
            <property name="jdbcUrl" value="${jdbc.url}" />
            <property name="user" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />

            <property name="minPoolSize" value="${jdbc.miniPoolSize}" />
            <property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
            <property name="initialPoolSize" value="${jdbc.initialPoolSize}" />
            <property name="maxIdleTime" value="${jdbc.maxIdleTime}" />
            <property name="acquireIncrement" value="${jdbc.acquireIncrement}" />
            <property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}" />
            <property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}" />
            <property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}" />
            <property name="preferredTestQuery" value="${jdbc.preferredTestQuery}" />
            <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" />
        </bean>

        <!-- JPA EntityManagerFactory -->
        <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
            p:dataSource-ref="dataSource">
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
                    p:database="${jpa.database}" p:showSql="${jpa.showSql}" />
            </property>
            <property name="jpaProperties">
                <props>
                    <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
                    <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
                    <prop key="hibernate.default_batch_fetch_size">${hibernate.default_batch_fetch_size}</prop>
                    <prop key="hibernate.search.default.directory_provider">${hibernate.search.default.directory_provider}</prop>
                    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                </props>
            </property>
        </bean>

        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
            p:entityManagerFactory-ref="entityManagerFactory" />

        <aop:aspectj-autoproxy proxy-target-class="true" />
        <context:component-scan base-package="com.wish" />
        <tx:annotation-driven transaction-manager="transactionManager" />

        <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    </beans>

    jdbc.miniPoolSize=1
    jdbc.maxPoolSize=10
    jdbc.initialPoolSize=1
    jdbc.maxIdleTime=21600
    jdbc.acquireIncrement=1
    jdbc.acquireRetryAttempts=30
    jdbc.acquireRetryDelay=1000
    jdbc.testConnectionOnCheckin=true
    jdbc.preferredTestQuery=select 1
    jdbc.idleConnectionTestPeriod=3600

    hibernate.search.default.directory_provider=com.wish.common.resource.hibernate.search.WishFSDirectoryProvider
    jpa.database=MYSQL
    jpa.showSql=false

    hibernate.hbm2ddl.auto=update

    hibernate.jdbc.fetch_size=50
    hibernate.jdbc.batch_size=30
    hibernate.default_batch_fetch_size=8
    hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://127.0.0.1:3306/bbcrafts?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf8
    jdbc.username=root
    jdbc.password=

    @Service
    public class OrderDao implements IOrderDao
    {

        @PersistenceContext
        private EntityManager em;

        @SuppressWarnings("unchecked")
        @Override
        public List<Order> getOrdersForTracking(String orderCode, String realName) throws RuntimeException
        {
            StringBuffer sql = new StringBuffer("select o from Order o");
            sql.append(" where (o.orderCode = ?1) and (o.billingRealName like concat('%',?2,'%')");
            sql.append(" or o.shippingRealName like concat('%',?3,'%'))");
            sql.append(" order by o.dateTime desc");

            Query query = em.createQuery(sql.toString());
            query.setParameter(1, orderCode);
            query.setParameter(2, realName);
            query.setParameter(3, realName);
            return query.getResultList();
        }

    TO find: Order temp = em.find(Order.class, orderID);
            return temp != null ? temp : new Order();

Libs:
activation-1.1, antlr-2.7.6, antlr-runtime-3.0, aopappliance-1.0, apache-lucene, commons-collections-3.1, commons-io-2.0.1, commons-logging-1.0.4, dom4j, ejb3-persistence-1.0.2.GA, hibernate3, hibernate-annoatation-3.4.0.GA, hibernate-commons-annoatation-3.1.0.GA, hibernate-core-3.3.2.GA, hibernate-entitymanager-3.4.0.GA, hibernate-search-3.1.1.GA, hibernate-validator-3.1.0.GA, javax.transaction, jstl-1.2, log4j, log4j-1.2.13, logback, javaassist-3.4.GA, jackson-all-1.9.0, IKanalyzer-3.1.2.GA, mysql-connector-java-5.1.18-bin, org-apache-commons-logging, pinyin4j-2.5.0, slf4j-api-1.7.9, all spring jars