2013-07-11 466 views
1

我正在使用Spring 3.1和Eclipselink 2與Tomcat,但由於某些原因數據不持久.. 儘管表正在生成。Spring Eclipselink持久性問題(無插入)

調度-servlet.xml中

<?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:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.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:component-scan base-package="com.myapp.user.controllers" /> 
<mvc:annotation-driven /> 

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/> 

<bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
     p:prefix="/WEB-INF/jsp/" 
     p:suffix=".jsp" /> 

</beans> 

的applicationContext.xml

<?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:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<aop:aspectj-autoproxy /> 

<context:load-time-weaver aspectj-weaving="on"/> 


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

<bean id="loadTimeWeaver" class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 

<bean id="jpaVendorAdapter" 
     class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
    <property name="database" value="MYSQL"/> 
    <property name="showSql" value="true"/> 
    <property name="generateDdl" value="false"/> 
    <property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform"/> 
</bean> 

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
     p:persistenceUnitName="myAppPU" 
     p:persistenceXmlLocation="classpath*:META-INF/persistence.xml" 
     p:jpaVendorAdapter-ref="jpaVendorAdapter" 
     p:loadTimeWeaver-ref="loadTimeWeaver" 
     p:dataSource-ref="dataSource" 
/> 

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

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/qpdb?zeroDateTimeBehavior=convertToNull"/> 
    <property name="username" value="root"/> 
    <property name="password" value=""/> 
</bean> 

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

</beans> 

的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="myAppPU" transaction-type="RESOURCE_LOCAL"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
<class>com.myapp.entities.GenericUser</class> 
<properties> 
    <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/qpdb?zeroDateTimeBehavior=convertToNull"/> 
    <property name="javax.persistence.jdbc.password" value=""/> 
    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
    <property name="javax.persistence.jdbc.user" value="root"/> 
    <!--<property name="eclipselink.weaving" value="static"/>--> 
</properties> 
</persistence-unit> 
</persistence> 

WelcomeController.java

package com.myapp.user.controllers; 
import com.myapp.entities.GenericUser; 
import java.math.BigInteger; 
import java.util.Map; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import org.springframework.stereotype.Controller; 
import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Transactional(propagation=Propagation.SUPPORTS) 
@Controller 
public class WelcomeController { 

@PersistenceContext 
private EntityManager entityManager; 

public WelcomeController() { 
} 

@RequestMapping({"/"}) 
public String showPublicPage(Map<String, Object> model) { 
    GenericUser gu = new GenericUser(); 
    addUser(gu); 
    return "welcome"; 
} 

@Transactional(propagation= Propagation.REQUIRED,readOnly=false) 
public void addUser(GenericUser gu) { 
    gu.setUserID(BigInteger.ONE); 
    gu.setEmail("asdfadf"); 
    entityManager.persist(gu); 
} 
} 

GenericUser.java

package com.myapp.entities; 

import java.io.Serializable; 
import java.math.BigInteger; 
import java.util.Date; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 

@Entity 
@Table(name="generic_user") 
public class GenericUser implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "USER_ID") 
private BigInteger userID; 
@Column(name = "USERNAME") 
private String username; 
@Column(name = "EMAIL") 
private String email; 
@Column(name = "PASSWORD") 
private String password; 

public BigInteger getUserID() { 
    return userID; 
} 

public void setUserID(BigInteger id) { 
    this.userID = id; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (userID != null ? userID.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof GenericUser)) { 
     return false; 
    } 
    GenericUser other = (GenericUser) object; 
    if ((this.userID == null && other.userID != null) || (this.userID != null && !this.userID.equals(other.userID))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "com.myapp.entities.GenericUser[ id=" + userID + " ]"; 
} 
} 

我起tomcat與-javaagent:路徑/到/彈簧劑2.5.6.SEC03.jar

Tomcat的登錄

年07月11 ,2013 9:30:36 PM org.apache.catalina.core.ApplicationContext log

信息:銷燬Spring FrameworkServlet'調度程序'

2013年7月11日下午九時30分36秒org.apache.catalina.core.ApplicationContext登錄

信息:關閥彈簧根WebApplicationContext的

2013年7月11日下午9點33分13秒org.apache。 catalina.core.ApplicationContext登錄

信息:在類路徑

檢測到7月11日無春WebApplicationInitializer類型,2013下午9時33分13秒org.apache.catalina.core.ApplicationContext登錄

IN FO:初始化春根WebApplicationContext的

2013年7月11日下午9時33分13秒org.apache.catalina.core.StandardContext listenerStart

嚴重:異常發送上下文初始化事件監聽器類org.springframework的實例。 web.context.ContextLoaderListener

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:來自ServletContext資源的XML文檔中的第52行[/WEB-INF/applicationContext.xml]無效;嵌套異常是org.xml.sax.SAXParseException; lineNumber:52; columnNumber:6;處理指令目標匹配「[xX] [mM] [lL]」是不允許的。

在org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)

在org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader。的java:302)

在org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)

在org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader。的java:209)

在org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)

在org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicati onContext.java:125)

在org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)

在org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext。的java:131)

在org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:522)

在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext的.java:436)

在org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)

在org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284 )

在org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)

在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)

在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)

在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

在有機apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)

在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)

在org.apache.catalina。 core.StandardHost.addChild(StandardHost.java:615)

在org.apache.catalina.startup.HostConfig.deployDescriptor在(HostConfig.java:649)

在org.apache.catalina.startup.HostConfig $ DeployDescriptor.run(HostConfig.java:1585)

java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)

在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:334)

在java.util中。 concurrent.FutureTask.run(FutureTask。Java的:166)

在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)

在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:603)

at java.lang.Thread.run(Thread.java:722)

引起:org.xml.sax.SAXParseException; lineNumber:52; columnNumber:6;處理指令目標匹配「[xX] [mM] [lL]」是不允許的。

在com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)

在com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper。 fatalError(ErrorHandlerWrapper.java:177)

在com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)

在com.sun.org.apache。 xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)

在com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1388)

在com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData( XMLScanner.java:675)

在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(XMLDocumentFragmentScannerImpl.java:980)

在com.sun.org.apache.xerces。 internal.impl.XMLScanner.scanPI(XMLScanner.java:643)

at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next(XMLDocumentS cannerImpl.java:913)

在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)

在com.sun.org.apache.xerces。 internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)

在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)

在COM。 sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)

在com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)

在com.sun.org.apache.xerces.internal.parsers.XMLParser.parse (XMLParser.java:123)

在com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:237)

在com.sun.org.apache.xerces .internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)

at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(De faultDocumentLoader。Java的:75)

在org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)

... 27多個

2013年7月11日9:33: 13日下午org.apache.catalina.core.ApplicationContext登錄

信息:關閥彈簧根WebApplicationContext的

2013年7月11日下午9點33分十三秒org.apache.catalina.core.StandardContext listenerStop

嚴重:異常發送上下文破壞事件監聽器類org.springframework.web.context.ContextLoaderListener的實例

java.lang.IllegalStateException:Bean工廠未初始化或已關閉 - 通過訪問豆之前所說的「刷新」的ApplicationContext

在org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:172)

在org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1066)

在org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1040)

在org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:988)

在org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:556)

在org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142)

在org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4819)

在org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5466)

在有機apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)

在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)

在org.apache.catalina。 core.ContainerBase.addChildInternal(ContainerBase.java:895)

在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)

在org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)

在有機apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649)

在org.apache.catalina.startup.HostConfig $ DeployDescriptor.run(HostConfig.java:1585)

在java.util中。 concurrent.Executors $ RunnableAdapter.call(執行人。Java的:471)

在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:334)

在java.util.concurrent.FutureTask.run(FutureTask.java:166)

在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)

在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:603)

在java.lang中.Thread.run(Thread.java:722)

2013年7月11日下午9時33分15秒org.apache.catalina.core.ApplicationContext登錄

信息:在類路徑

檢測到7月11日無春WebApplicationInitializer類型,2013下午9時33分15秒org.apache.catalina.core.ApplicationContext登錄

信息:初始化春根WebApplicationContext的

2013年7月11日下午9時33分18秒org.apache.catalina.core.ApplicationContext登錄

INFO:初始化春FrameworkServlet的 '調度'

2013年7月11日下午9點34分32秒org.apache.catalina.core.ApplicationContext登錄

信息:銷燬春FrameworkServlet的 '調度'

2013年7月11日下午9時34分32秒org.apache.catalina.core.ApplicationContext登錄

信息:關閥彈簧根WebApplicationContext的

2013年7月11日下午9時34分34秒org.apache.catalina。 core.Application語境日誌

信息:在類路徑

2013年7月11日下午九時34分34秒檢測org.apache.catalina.core.ApplicationContext日誌中沒有春天WebApplicationInitializer類型

信息:初始化春根的WebApplicationContext

2013年7月11日下午9時34分37秒org.apache.catalina.core.ApplicationContext登錄

信息:初始化春FrameworkServlet的 '調度'

應用程序成功運行並打開「歡迎」的看法,但數據(GenericUser區)沒有堅持......

+0

你的applicationContext.xml對線路52可能是一個problema行:' renanlf

+0

修正了..但是現在沒有名稱爲myAppPU的持久化單元可以找到...... persistence.xml進入build/web/WEB-INF/classes/META-INF/build ..之後,我在applicationContext.xml中指定了persistenceXmlLocation ...任何想法? – PrawDG

回答

0

終於解決了...發佈我的解決方案,以備將來參考..

在到達工作解決方案之前,我改變了很多東西..我不記得確切的問題在哪裏..所以我提到了我所做的所有更改。

  1. 改變了所有的XSD版本3.1。(它可能也無妨)

  2. 如果您使用的是Tomcat使用spring-tomcat-weaver.jar負載時間編織提到here

  3. 的主要問題:

Spring的文檔指出以下幾點:

<tx:annotation-driven/>只查找@Transactional在它的定義相同的應用程序上下文豆這意味着, ,如果您爲DispatcherServlet放入WebApplicationContext,它只會檢查控制器中的@Transactional bean,而不是您的服務。有關更多信息,請參見第15.2節「DispatcherServlet」。

由於<tx:annotation-driven>applicationContext.xml所有要使用@Transactional必須以應用程序上下文中被發現的類被聲明。因此,您還需要在應用程序上下文中指定<context:component-scan>。但請確保您不重新發現已在dispatcher-servlet.xml中指定的控制器。您可以在<context:component-scan>元素內使用include-filterexclude-filter元素來實現此目的。 詳細解釋here

你將無法在你的控制器使用@Transactional ..(你不應該IMO)

1

大概p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"這是不對的.. 儘量把XML你的WEB-INF /文件夾並將其鏈接爲:persistenceXmlLocation =「myxml.xml」

+0

但大多數spring文檔指定它在meta-inf /中並且注意它沒有找到persistence.xml未找到(如果我給出錯誤的路徑,它會給出FileNotFoundException),它只是說沒有找到持久性單元。 .. – PrawDG

1

您可以檢查依賴項罐是否在正確的位置可用?

+0

解決了這個問題..所有的依賴關係都在正確的位置.. – PrawDG