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