11 votes

Spring Boot - "Error creating bean with name 'entityManagerFactory'" - Démarrage

J'ai vu beaucoup de questions mais les réponses ne répondent pas à mon problème... Je commence avec Spring Boot et je suis complètement perdu.

L'erreur est :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: pack.datas.entities.Degree

/// autres lignes

Caused by: org.hibernate.AnnotationException: No identifier specified for entity: pack.datas.entities.Degree

Le point d'entrée :

package pack;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@RestController
@EntityScan
public class CandidatesRecruitmentApplication {

    public static void main(String[] args) {
        SpringApplication.run(CandidatesRecruitmentApplication.class, args);
    }
}

Les classes :

package pack.datas;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder;
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.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.stereotype.Component;

@Component
@Configuration
@EnableJpaRepositories
public class DatasFactory {

    private DataSource dataSource;

    public DatasFactory() {
        super();
    }

    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource() {
        if(this.dataSource == null)
            return this.dataSource = DataSourceBuilder.create().build();
        else
            return this.dataSource;
    }

package pack.datas.entities;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Table;

import org.springframework.data.annotation.Id;

@Entity
@Table(name = "degree")
public class Degree implements Serializable {

    private static final long serialVersionUID = -8900492704842756948L;

    @Id
    @GeneratedValue
    @Column(name = "pk_id")
    private Integer id;

    @Column(name = "degree_i")
    private Integer degreeId;

    @Column(name = "degree_s_en")
    private String degreeEn;

    @Column(name = "degree_s_fr")
    private String degreeFr;

    protected Degree() {
    }

    public Degree(Integer id, Integer degreeId, String degreeEn, String degreeFr) {
        super();
        this.id = id;
        this.degreeId = degreeId;
        this.degreeEn = degreeEn;
        this.degreeFr = degreeFr;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getDegreeId() {
        return degreeId;
    }

    public void setDegreeId(Integer degreeId) {
        this.degreeId = degreeId;
    }

    public String getDegreeEn() {
        return degreeEn;
    }

    public void setDegreeEn(String degreeEn) {
        this.degreeEn = degreeEn;
    }

    public String getDegreeFr() {
        return degreeFr;
    }

    public void setDegreeFr(String degreeFr) {
        this.degreeFr = degreeFr;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((degreeEn == null) ? 0 : degreeEn.hashCode());
        result = prime * result + ((degreeFr == null) ? 0 : degreeFr.hashCode());
        result = prime * result + ((degreeId == null) ? 0 : degreeId.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Degree other = (Degree) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (degreeEn == null) {
            if (other.degreeEn != null)
                return false;
        } else if (!degreeEn.equals(other.degreeEn))
            return false;
        if (degreeFr == null) {
            if (other.degreeFr != null)
                return false;
        } else if (!degreeFr.equals(other.degreeFr))
            return false;
        if (degreeId == null) {
            if (other.degreeId != null)
                return false;
        } else if (!degreeId.equals(other.degreeId))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Degree [ " + degreeId + " - " + degreeEn + "/" + degreeFr + " ]";
    }

}

package pack.datas.controller;

import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class DaoController {

    @GetMapping("/")
    @ResponseBody
    @Transactional(readOnly = true)
    String home() {
        return "<h1>Test Program</h1>";
    }
}

Le fichier 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>pack</groupId>
    <artifactId>candidates-recruitment</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>candidates-recruitment</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.maven.surefire/surefire-api -->
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-api</artifactId>
            <version>2.19.1</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
        <repository>
            <id>org.jboss.repository.releases</id>
            <name>JBoss Maven Release Repository</name>
            <url>https://repository.jboss.org/nexus/content/repositories/releases</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/libs-release</url>
        </pluginRepository>
    </pluginRepositories>

</project>

L'application.yml :

# DATASOURCE (DataSourceProperties)
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/recruitments_db
    username: postgresql
    password: postgresql
    driver-class-name: org.postgresql.Driver

# HIBERNATE (HibernateProperties)
hibernate:
  dialect: org.hibernate.dialect.PostgreSQLDialect
  show_sql: true
  hbm2ddl.auto: create

#SECURITY (SecuriyProperties)
security:
  user:
    name: TestU
    password: Test1

S'il vous plaît, j'ai besoin de votre aide !

29voto

Piotr Podraza Points 841

On dirait que tu as utilisé @Id de l'annotation du mauvais paquet dans votre Degree classe. Changez votre importation de org.springframework.data.annotation.Id a javax.persistence.Id . Cela devrait aider à résoudre l'exception que vous obtenez.

1voto

Ashwini Points 186

Utiliser

 javax.persistence.Id

au lieu de

org.springframework.data.annotation.Id

résoudra le problème

0voto

Anant Pathak Points 31

J'ai rencontré le même problème aujourd'hui. Après un peu de débogage, j'ai appris que j'avais annoté l'un des champs de ma classe de modèle avec la mention @GeneratedValue(strategy = GenerationType.AUTO) mais n'a pas ajouté le @Id L'ajout d'une annotation a permis de résoudre le problème.

0voto

Hibernate jar était corrompu dans le dépôt local de maven, il prenait la bibliothèque corrompue à chaque fois, après avoir supprimé le dépôt local de maven, le problème est résolu.

C:\Users\user.m2\repository

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X