2013-07-11 109 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