java - spring jpa - At least one JPA metamodel must be present* -


anybody know why doesn't work?

error starting applicationcontext. display auto-configuration report re-run application 'debug' enabled. 06/04/2017 14:11:24.732 error [main] - org.springframework.boot.springapplication: application startup failed org.springframework.beans.factory.beancreationexception: error creating bean name 'jpamappingcontext': invocation of init method failed; nested exception java.lang.illegalargumentexception: @ least 1 jpa metamodel must present!     @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean(abstractautowirecapablebeanfactory.java:1628)     @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:555)     @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:483)     @ org.springframework.beans.factory.support.abstractbeanfactory$1.getobject(abstractbeanfactory.java:306)     @ org.springframework.beans.factory.support.defaultsingletonbeanregistry.getsingleton(defaultsingletonbeanregistry.java:230)     @ org.springframework.beans.factory.support.abstractbeanfactory.dogetbean(abstractbeanfactory.java:302)     @ org.springframework.beans.factory.support.abstractbeanfactory.getbean(abstractbeanfactory.java:197)     @ org.springframework.beans.factory.support.defaultlistablebeanfactory.preinstantiatesingletons(defaultlistablebeanfactory.java:742)     @ org.springframework.context.support.abstractapplicationcontext.finishbeanfactoryinitialization(abstractapplicationcontext.java:866)     @ org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:542)     @ org.springframework.boot.context.embedded.embeddedwebapplicationcontext.refresh(embeddedwebapplicationcontext.java:122)     @ org.springframework.boot.springapplication.refresh(springapplication.java:737)     @ org.springframework.boot.springapplication.refreshcontext(springapplication.java:370)     @ org.springframework.boot.springapplication.run(springapplication.java:314)     @ org.springframework.boot.springapplication.run(springapplication.java:1162)     @ org.springframework.boot.springapplication.run(springapplication.java:1151)     @ com.cadit.web.webapplicationaware.main(webapplicationaware.java:19) caused by: java.lang.illegalargumentexception: @ least 1 jpa metamodel must present!     @ org.springframework.util.assert.notempty(assert.java:277)     @ org.springframework.data.jpa.mapping.jpametamodelmappingcontext.<init>(jpametamodelmappingcontext.java:52)     @ org.springframework.data.jpa.repository.config.jpametamodelmappingcontextfactorybean.createinstance(jpametamodelmappingcontextfactorybean.java:71)     @ org.springframework.data.jpa.repository.config.jpametamodelmappingcontextfactorybean.createinstance(jpametamodelmappingcontextfactorybean.java:26)     @ org.springframework.beans.factory.config.abstractfactorybean.afterpropertiesset(abstractfactorybean.java:134)     @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.invokeinitmethods(abstractautowirecapablebeanfactory.java:1687)     @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean(abstractautowirecapablebeanfactory.java:1624)     ... 16 common frames omitted 

i defined entities in com.cadit.entities:

import javax.persistence.column; import javax.persistence.entity; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.table;  @entity @table(name="test") public class genericbeans implements beantype, ientity<long> {      /**      *       */     private static final long serialversionuid = 1l;      @id     @generatedvalue(strategy=generationtype.identity)     @column(name = "test_paid")     protected long id;      @column(name = "societa")     private string societacod;     @column(name = "conto_intermediario")     private string contoint;     @column(name = "tipo_operazione")     private string tipoope;       public genericbeans(string societacod, string contoint, string tipoope) {         societacod = societacod;         this.contoint = contoint;         this.tipoope = tipoope;     }       public genericbeans() {      }         public string getsocietacod() {         return societacod;     }       public void setsocietacod(string societacod) {         societacod = societacod;     }       public string getcontoint() {         return contoint;     }       public void setcontoint(string contoint) {         this.contoint = contoint;     }       public string gettipoope() {         return tipoope;     }       public void settipoope(string tipoope) {         this.tipoope = tipoope;     }       @override     public string tostring() {         return "csv [societacod=" + societacod + ", contoint=" + contoint + ", tipoope=" + tipoope + "]";     }       @override     public long getid() {         return this.id;     }       @override     public void setid(long id) {         this.id=id;          }  } 

i definied datasource entry definition spring:

import org.apache.log4j.logger; import org.springframework.boot.autoconfigure.domain.entityscan; import org.springframework.boot.autoconfigure.jdbc.datasourcebuilder; import org.springframework.boot.context.properties.configurationproperties; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.componentscan; import org.springframework.context.annotation.configuration; import org.springframework.context.annotation.propertysource; import org.springframework.transaction.annotation.enabletransactionmanagement;  @configuration @componentscan @entityscan("com.cadit.entities") //@enablejparepositories("com.cadit.entities") @enabletransactionmanagement @propertysource("classpath:db-config.properties") public class dbautoconfiguration {        static final logger logger = logger.getlogger(dbautoconfiguration.class);      public dbautoconfiguration() {      }       @bean     @configurationproperties(prefix = "spring.datasource")     public datasource datasource(){         //datasource ds =new embeddeddatabasebuilder().addscript("classpath:sql/schema.sql").addscript("classpath:testdb/data.sql").build();         datasourcebuilder ds =  datasourcebuilder.create();         logger.info("datasource = " + ds);         return ds.build();      } } 

my db-config.properties is:

spring.jpa.hibernate.ddl-auto: validate spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.improvednamingstrategy #spring.jpa.database: sql spring.jpa.show-sql: true  spring.datasource.driverclassname=net.sourceforge.jtds.jdbc.driver spring.datasource.url=jdbc:jtds:sqlserver://localhost:1433;databasename=example spring.datasource.username=xxx spring.datasource.password=xxx 

ientity is:

public interface ientity <i extends serializable> extends serializable{  /**   * property rappresenta la primary key.   */   string p_id = "id";    /**    * restituisce la primary key    * @return    */   getid();    /**    * imposta la primary key    * @param id    */   void setid(i id); } 

i try write csv file database using crudrepository interface of spring:

import java.io.file; import java.util.collections; import java.util.linkedlist; import java.util.list;  import org.apache.log4j.logger; import org.springframework.beans.factory.annotation.autowired; import org.springframework.core.io.classpathresource; import org.springframework.data.repository.crudrepository;  import com.cadit.entities.genericbeans; import com.csvreader.csvreader;  public class csvreaders {      static final logger logger = logger.getlogger(csvreader.class);      @autowired     public crudrepository<genericbeans,long> _entitymanager;      public list loaddatafromcsv(string filename) {         try {              file file = new classpathresource(filename).getfile();             csvreader csv = new csvreader(file.getabsolutefile().getpath(),';');             csv.readheaders();             list l = new linkedlist();             genericbeans b = new genericbeans ();             while (csv.readrecord())             {                 b.setsocietacod(csv.get(0));                 b.setcontoint(csv.get(1));                 b.settipoope(csv.get(2));                 _entitymanager.save(b); //persist on db                 l.add(b);                 b = new genericbeans();             }             b=null;             return l;         } catch (exception e) {             logger.error("error occurred while loading object list file " + filename, e);             return collections.emptylist();         }     }   }  

i not use main class class extend springbootservletinitializer because want run on both standalone tomcat , tomcat installation war application

import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.enableautoconfiguration; import org.springframework.boot.builder.springapplicationbuilder; import org.springframework.boot.web.support.springbootservletinitializer; import org.springframework.context.annotation.componentscan; import org.springframework.context.annotation.configuration;   @configuration @componentscan(basepackages={"com.cadit.entities","com.cadit.beans"}) @enableautoconfiguration public class webapplicationaware extends springbootservletinitializer {      private static class<webapplicationaware> applicationclass = webapplicationaware.class;        public static void main(string[] args) {             springapplication.run(applicationclass, args);         }          @override         protected springapplicationbuilder configure(springapplicationbuilder application) {             return application.sources(applicationclass);         }     } 

all properties file in classpath resources because it's maven project.

pom.xml:

<?xml version="1.0" encoding="utf-8"?> <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.springframework</groupid>     <artifactid>xxxx</artifactid>     <version>0.1.0</version>     <packaging>war</packaging>      <parent>         <groupid>org.springframework.boot</groupid>         <artifactid>spring-boot-starter-parent</artifactid>         <version>1.5.2.release</version>     </parent>      <dependencies>         <dependency>             <groupid>org.springframework.boot</groupid>             <artifactid>spring-boot-starter-web</artifactid>          </dependency>         <dependency>             <groupid>org.springframework.boot</groupid>             <artifactid>spring-boot-starter-tomcat</artifactid>             <scope>provided</scope>         </dependency>         <dependency>             <groupid>javax.servlet</groupid>             <artifactid>javax.servlet-api</artifactid>             <version>3.1.0</version>             <scope>provided</scope>         </dependency>         <dependency>             <groupid>org.springframework.boot</groupid>             <artifactid>spring-boot-starter-test</artifactid>             <scope>test</scope>         </dependency>         <dependency>             <groupid>com.jayway.jsonpath</groupid>             <artifactid>json-path</artifactid>             <scope>test</scope>         </dependency>        <dependency>         <groupid>org.springframework.data</groupid>         <artifactid>spring-data-jpa</artifactid>         <version>1.11.1.release</version>     </dependency>     <dependency>          <groupid>javax.persistence</groupid>          <artifactid>persistence-api</artifactid>          <version>1.0.2</version>      </dependency>            <!-- altre dipendenze non spring -->         <!-- https://mvnrepository.com/artifact/net.sourceforge.javacsv/javacsv -->         <dependency>             <groupid>net.sourceforge.javacsv</groupid>             <artifactid>javacsv</artifactid>             <version>2.0</version>         </dependency>          <!--  per jpa solo se si usa il tomcat embedded -->         <dependency>             <groupid>net.sourceforge.jtds</groupid>             <artifactid>jtds</artifactid>             <version>1.3.1</version>             <scope>provided</scope>         </dependency>          <dependency>             <groupid>org.apache.commons</groupid>             <artifactid>commons-dbcp2</artifactid>             <version>2.1.1</version>         </dependency>          <dependency>             <groupid>org.apache.commons</groupid>             <artifactid>commons-pool2</artifactid>             <version>2.0</version>             <scope>provided</scope>         </dependency>         <!--  end -->            <!-- dipendenze logback -->       <dependency>             <groupid>org.slf4j</groupid>             <artifactid>slf4j-api</artifactid>             <version>1.7.5</version>             <scope>compile</scope>         </dependency>         <dependency>             <groupid>org.slf4j</groupid>             <artifactid>jcl-over-slf4j</artifactid>             <version>1.7.5</version>             <scope>runtime</scope>         </dependency>         <dependency>             <groupid>ch.qos.logback</groupid>             <artifactid>logback-classic</artifactid>             <version>1.1.7</version>             <scope>compile</scope>         </dependency>         <dependency>             <groupid>ch.qos.logback</groupid>             <artifactid>logback-core</artifactid>             <version>1.1.7</version>         </dependency>          <!-- fine dip logback -->      </dependencies>      <properties>      <start-class>hello.webapplicationaware</start-class>         <project.build.sourceencoding>utf-8</project.build.sourceencoding>         <project.reporting.outputencoding>utf-8</project.reporting.outputencoding>         <java.version>1.8</java.version>     </properties>       <build>     <resources>             <resource>                 <directory>src/main/resources</directory>                 <filtering>true</filtering>             </resource>         </resources>     </build>      <repositories>         <repository>             <id>spring-releases</id>             <url>https://repo.spring.io/libs-release</url>         </repository>     </repositories>     <pluginrepositories>         <pluginrepository>             <id>spring-releases</id>             <url>https://repo.spring.io/libs-release</url>         </pluginrepository>     </pluginrepositories> </project> 

what's problem, why doesn't find jpa entities when run webapplicationaware class?

spring not find jpa entities, no jpa meta model created, why face exception.

the cause of problem may wrong persistence-api version on class path.

you using

<dependency>      <groupid>javax.persistence</groupid>      <artifactid>persistence-api</artifactid>      <version>1.0.2</version>  </dependency>  

but pretty shure spring version uses persistence-api version 2.

could be, using @entity annotation version 1 ? @ runtime spring uses version 2, , searching entites using @entity version 2 !

remove dependencies

<dependency>    <groupid>org.springframework.boot</groupid>    <artifactid>spring-boot-starter-test</artifactid>    <scope>test</scope> </dependency>     <dependency>    <groupid>org.springframework.data</groupid>    <artifactid>spring-data-jpa</artifactid>    <version>1.11.1.release</version> </dependency> 

instead add

  <dependency>      <groupid>org.springframework.boot</groupid>      <artifactid>spring-boot-starter-data-jpa</artifactid>   </dependency> 

this give jpa dependencies in right version.


Comments

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -