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
Post a Comment