java - Entity not persisting via Spring(CrudRepository) on TomEE -


i have issues trying persist entity postgresql database using springs crudrepository interface. have had quite issues setting correct values both on tomee , adjusting configuration of spring itself. tried briefly use hibernate, issues got worse, switched openjpa bundled tomee.

i have bit of experience plain javaee , creating application learn spring , friend of mine needs spring application fool around deployment on tomee based applicationserver, 2 requirements. might go bit overboard amount of code attach, rather let see there overview.

components have developed , brief description of i'm doing, expecting , seeing. components:

  • coworkercontroller (restful spring controller)
  • coworkerservice (spring service interact controller , repository)
  • coworkerrepository (extends spring crudrepository)
  • coworker (entity supposed persisted)

flow of actions:

  • send post via curl firstname lastname restful service
  • getting status 200 id of persisted entity
  • checking postgresql , restful service if can query created coworker

what i'm expecting:

  • controller accepts post , calls service persist coworker
  • service tells repository save coworker
  • repository persists coworker entity via spring magic
  • spring/openjpa magic connects datasource, create id , return entity on success
  • see sql queries during happening
  • repository receives persisted entity , returns service
  • service returns entity controller
  • controller returns entity.id caller of rest service

what see , don't see expect see:

  • controller works expected
  • service logs correct user info
  • @prepersist creates date object (logger)
  • sql statement logs openjpa sequence queries
  • missing: no sql insert statement persisting entity
  • repository returns new coworker service
  • service logs supposed persisted entity creationdate , id(e.g. 1)
  • controller returns id caller of rest (e.g. 1)
  • neither rest nor sql queries show coworker in database :(

my configuration files have gotten quite mess after trying different kinds of troubleshooting found via google, , lots of tutorials. after spending several days trying figure out issue is, come here , hope might able point me error.

coworker.java

@entity public class coworker implements serializable {      @transient     logger logger = loggerfactory.getlogger(this.getclass());      @id     @generatedvalue(strategy = generationtype.sequence)     private long coworkerid;     private string firstname;     private string lastname;     @temporal(temporaltype.date)     private date creationdate;     @temporal(temporaltype.date)     private date lastupdateddate;     @onetomany(cascade = cascadetype.all, mappedby = "coworker", fetch = fetchtype.eager)     private set<timeframe> timeframes = new hashset<timeframe>();      @prepersist     private void setdatebeforepersisting() {         logger.info("inside prepersisting coworker");         creationdate = new date();         // set last updated date creation date         lastupdateddate = (date) creationdate.clone();     }     // ...snip.. getters, setters, equals, hashcode created idea here } 

coworkercontroller.java

@controller @requestmapping(value = "coworker") public class coworkercontroller {     @autowired     coworkerservice service;     logger logger = loggerfactory.getlogger(this.getclass());      @requestmapping(method = requestmethod.post)     @responsebody     public long create(@requestbody coworker coworker) {         logger.info("post create coworker.");         if (coworker == null) {             logger.info("coworker == null");         } else {             logger.info("coworker.firstname: " + coworker.getfirstname() + " coworker.lastname: " + coworker.getlastname());         }         final coworker coworker1 = service.addnewcoworker(coworker);         logger.info("persisted coworker, id: " + coworker1.getcoworkerid());         return coworker1.getcoworkerid();     } } 

coworkerserviceimpl.java

@service @transactional(readonly = false, propagation = propagation.required) public class coworkerserviceimpl implements coworkerservice  {     logger logger = loggerfactory.getlogger(this.getclass());      @override     public coworker addnewcoworker(coworker coworker) {         logger.info("service saving coworker: " + coworker.getfirstname() + " " + coworker.getlastname());         final coworker save = repo.save(coworker);         logger.info("service saved coworker, != null? " + (save != null));         logger.info("first name: " + save.getfirstname() + " last name: " + save.getlastname() + " date created: " + save.getcreationdate() + " id: " + save.getcoworkerid());         return save;     }  } 

coworkerrepository.java

public interface coworkerrepository extends crudrepository<coworker, long> {     // several queries here, nothing should interfer     // crudrepository.save(s) } 

persistence.xml

<?xml version="1.0" encoding="utf-8" ?> <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" version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">     <persistence-unit name="timeregistration" transaction-type="resource_local">         <non-jta-data-source>java:/comp/env/jdbc/timeregistration</non-jta-data-source>         <class>org.xezz.timeregistration.model.coworker</class>         <class>org.xezz.timeregistration.model.customer</class>         <class>org.xezz.timeregistration.model.project</class>         <class>org.xezz.timeregistration.model.timeframe</class>     </persistence-unit> </persistence> 

timeregistration-servlet.xml

<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans"        xmlns:jpa="http://www.springframework.org/schema/data/jpa"        xmlns:mvc="http://www.springframework.org/schema/mvc"        xmlns:context="http://www.springframework.org/schema/context"        xmlns:tx="http://www.springframework.org/schema/tx"        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.2.xsd         http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context-3.2.xsd         http://www.springframework.org/schema/tx         http://www.springframework.org/schema/tx/spring-tx-3.2.xsd         http://www.springframework.org/schema/data/jpa         http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd         http://www.springframework.org/schema/mvc         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">      <mvc:resources mapping="/static/**" location="/static/"/>     <mvc:default-servlet-handler/>     <mvc:annotation-driven />     <jpa:repositories base-package="org.xezz.timeregistration.repositories"/>     <context:component-scan base-package="org.xezz.timeregistration" />     <tx:annotation-driven transaction-manager="transactionmanager"/>     <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">         <property name="datasource" ref="datasource"/>     </bean>     <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean">         <property name="datasource" ref="datasource"/>         <property name="persistenceunitname" value="timeregistration"/>         <property name="jpavendoradapter">             <bean class="org.springframework.orm.jpa.vendor.openjpavendoradapter">                 <property name="generateddl" value="true"/>                 <property name="database" value="postgresql"/>                 <property name="showsql" value="true"/>             </bean>         </property>     </bean>     <bean id="datasource" class="org.springframework.jndi.jndiobjectfactorybean">         <property name="jndiname" value="java:/comp/env/jdbc/timeregistration"/>         <property name="resourceref" value="true" />     </bean>     <bean class="org.springframework.web.servlet.view.contentnegotiatingviewresolver">         <property name="mediatypes">             <map>                 <entry key="html" value="text/html"/>                 <entry key="json" value="application/json"/>             </map>         </property>         <property name="viewresolvers">             <list>                 <bean class="org.springframework.web.servlet.view.urlbasedviewresolver">                     <property name="viewclass" value="org.springframework.web.servlet.view.jstlview"/>                     <property name="prefix" value="/web-inf/jsp/"/>                     <property name="suffix" value=".jsp"/>                 </bean>             </list>         </property>         <property name="defaultviews">             <list>                 <bean class="org.springframework.web.servlet.view.json.mappingjacksonjsonview">                     <property name="prefixjson" value="true"/>                 </bean>             </list>         </property>     </bean> </beans> 

consolelog

mai 09, 2013 11:16:03 pm org.xezz.timeregistration.controller.coworkercontroller create information: post create coworker. mai 09, 2013 11:16:03 pm org.xezz.timeregistration.controller.coworkercontroller create information: coworker.firstname: bastian coworker.lastname: koch mai 09, 2013 11:16:03 pm org.xezz.timeregistration.services.impl.coworkerserviceimpl addnewcoworker information: service saving coworker: bastian koch mai 09, 2013 11:16:03 pm org.xezz.timeregistration.model.coworker setdatebeforepersisting information: inside prepersisting coworker mai 09, 2013 11:16:03 pm org.xezz.timeregistration.services.impl.coworkerserviceimpl addnewcoworker information: service saved coworker, != null? true 59370  timeregistration  trace  [http-bio-8080-exec-1] openjpa.jdbc.sql - <t 1732295982, conn 850080749> executing prepstmnt 553961214 select sequence_value openjpa_sequence_table id = ? update [params=?] 59421  timeregistration  trace  [http-bio-8080-exec-1] openjpa.jdbc.sql - <t 1732295982, conn 850080749> [50 ms] spent 59423  timeregistration  trace  [http-bio-8080-exec-1] openjpa.jdbc.sql - <t 1732295982, conn 683618612> executing prepstmnt 540500434 insert openjpa_sequence_table (id, sequence_value) values (?, ?) [params=?, ?] 59474  timeregistration  trace  [http-bio-8080-exec-1] openjpa.jdbc.sql - <t 1732295982, conn 683618612> [50 ms] spent 59476  timeregistration  trace  [http-bio-8080-exec-1] openjpa.jdbc.sql - <t 1732295982, conn 334967428> executing prepstmnt 512431903 select sequence_value openjpa_sequence_table id = ? update [params=?] 59479  timeregistration  trace  [http-bio-8080-exec-1] openjpa.jdbc.sql - <t 1732295982, conn 334967428> [3 ms] spent 59480  timeregistration  trace  [http-bio-8080-exec-1] openjpa.jdbc.sql - <t 1732295982, conn 334967428> executing prepstmnt 1033569251 update openjpa_sequence_table set sequence_value = ? id = ? , sequence_value = ? [params=?, ?, ?] 59493  timeregistration  trace  [http-bio-8080-exec-1] openjpa.jdbc.sql - <t 1732295982, conn 334967428> [12 ms] spent mai 09, 2013 11:16:04 pm org.xezz.timeregistration.services.impl.coworkerserviceimpl addnewcoworker information: first name: bastian last name: koch date created: thu may 09 23:16:03 cest 2013 id: 1 mai 09, 2013 11:16:04 pm org.xezz.timeregistration.controller.coworkercontroller create information: persisted coworker, id: 1 

tomee.xml

<?xml version="1.0" encoding="utf-8"?> <tomee>     <resource id="jdbc/timeregistration" type="datasource">         jdbcdriver org.postgresql.driver         jdbcurl jdbc:postgresql://localhost/timeregdb         username timereg         password supersecretpassword         jtamanaged false         initialsize 0         maxwait 50         maxactive 20         maxidle 20     </resource> </tomee> 

pom.xml

<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"          xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelversion>4.0.0</modelversion>     <groupid>org.xezz</groupid>     <artifactid>timeregistration</artifactid>     <version>1.0-snapshot</version>     <packaging>war</packaging>     <properties>         <project.build.sourceencoding>utf-8</project.build.sourceencoding>         <junit.version>4.11</junit.version>         <javax-persistence.version>2.0.0</javax-persistence.version>         <javax-inject.version>1</javax-inject.version>         <spring.version>3.2.2.release</spring.version>         <spring-data.version>1.3.1.release</spring-data.version>         <jackson.version>2.1.4</jackson.version>         <jackson-mapper-asl.version>1.9.12</jackson-mapper-asl.version>         <jaxb-api.version>2.2.7</jaxb-api.version>         <slf4j-api.version>1.7.1</slf4j-api.version>     </properties>     <dependencies>         <dependency>             <groupid>junit</groupid>             <artifactid>junit</artifactid>             <version>${junit.version}</version>             <scope>test</scope>         </dependency>         <dependency>             <groupid>org.slf4j</groupid>             <artifactid>slf4j-api</artifactid>             <version>${slf4j-api.version}</version>             <scope>provided</scope>         </dependency>         <dependency>             <groupid>org.eclipse.persistence</groupid>             <artifactid>javax.persistence</artifactid>             <version>${javax-persistence.version}</version>             <scope>provided</scope>         </dependency>         <dependency>             <groupid>org.springframework</groupid>             <artifactid>spring-core</artifactid>             <version>${spring.version}</version>         </dependency>         <dependency>             <groupid>org.springframework</groupid>             <artifactid>spring-context</artifactid>             <version>${spring.version}</version>         </dependency>         <dependency>             <groupid>org.springframework</groupid>             <artifactid>spring-web</artifactid>             <version>${spring.version}</version>         </dependency>         <dependency>             <groupid>org.springframework</groupid>             <artifactid>spring-webmvc</artifactid>             <version>${spring.version}</version>         </dependency>         <dependency>             <groupid>org.springframework.data</groupid>             <artifactid>spring-data-jpa</artifactid>             <version>${spring-data.version}</version>         </dependency>         <dependency>             <groupid>javax.inject</groupid>             <artifactid>javax.inject</artifactid>             <version>${javax-inject.version}</version>             <scope>provided</scope>         </dependency>          <dependency>             <groupid>javax.servlet</groupid>             <artifactid>jstl</artifactid>             <version>${jstl.version}</version>             <scope>provided</scope>         </dependency>          <dependency>             <groupid>org.codehaus.jackson</groupid>             <artifactid>jackson-mapper-asl</artifactid>             <version>${jackson-mapper-asl.version}</version>             <scope>runtime</scope>         </dependency>         <dependency>             <groupid>javax.xml.bind</groupid>             <artifactid>jaxb-api</artifactid>             <version>${jaxb-api.version}</version>             <scope>runtime</scope>         </dependency>     </dependencies>     <build>         <plugins>             <plugin>                 <groupid>org.apache.maven.plugins</groupid>                 <artifactid>maven-compiler-plugin</artifactid>                 <version>2.3.1</version>                 <configuration>                     <source>1.6</source>                     <target>1.6</target>                 </configuration>             </plugin>         </plugins>     </build> </project> 

thanks in advance, have wasted time right trying track down different errors (especially following hibernate stuff, more time consuming dare tell), right have ask else on , share wisdom me , don't hesitate if need more information (i can update github current codebase if needed).

i think using wrong transactionmanager in spring configuration xml. since want use spring jpa, should use jpatransactionmanager.

for example, think configuration should follows:

<bean id="transactionmanager" class="org.springframework.orm.jpa.jpatransactionmanager">     <property name="entitymanagerfactory" ref="entitymanagerfactory"/> </bean> 

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -