繁体   English   中英

使用JPA将Spring Boot连接到MySQL时出错

[英]Error to connect Spring Boot to MySQL with JPA

我用Spring BootJPAMySQL数据库创建了一个简单的项目,当我运行主SpringApplication它显示了此错误

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

2019-08-19 13:13:42.928  INFO 8808 --- [           main] com.spring.votreBanque                   : Starting votreBanque on emna-PC with PID 8808 (D:\logiciel\springTest\target\classes started by emna in D:\logiciel\springTest)
2019-08-19 13:13:42.955  INFO 8808 --- [           main] com.spring.votreBanque                   : No active profile set, falling back to default profiles: default
2019-08-19 13:14:15.272  INFO 8808 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-08-19 13:14:18.129  INFO 8808 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 1452ms. Found 5 repository interfaces.
2019-08-19 13:14:20.066  INFO 8808 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.hateoas.config.HateoasConfiguration' of type [org.springframework.hateoas.config.HateoasConfiguration$$EnhancerBySpringCGLIB$$2f259fcc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-08-19 13:14:20.085  INFO 8808 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$afa5529a] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-08-19 13:14:23.871  INFO 8808 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 2020 (http)
2019-08-19 13:14:24.166  INFO 8808 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-08-19 13:14:24.167  INFO 8808 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.22]
2019-08-19 13:14:24.963  INFO 8808 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-08-19 13:14:24.963  INFO 8808 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 41633 ms
2019-08-19 13:14:25.902  WARN 8808 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clientMetierImplementation': Unsatisfied dependency expressed through field 'clientrepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clientRepository': Post-processing of merged bean definition failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType;
2019-08-19 13:14:25.907  INFO 8808 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2019-08-19 13:14:26.003  WARN 8808 --- [           main] o.a.c.loader.WebappClassLoaderBase       : The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 java.lang.ref.ReferenceQueue.remove(Unknown Source)
 com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:41)
2019-08-19 13:14:26.044  INFO 8808 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-08-19 13:14:26.062 ERROR 8808 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.<init>(PersistenceAnnotationBeanPostProcessor.java:665)

The following method did not exist:

    javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType;

The method's class, javax.persistence.PersistenceContext, is available from the following locations:

    jar:file:/D:/javacert/javax.persistence.jar!/javax/persistence/PersistenceContext.class
    jar:file:/D:/javacert/hibernate-jpa-2.1-api-1.0.0.final.jar!/javax/persistence/PersistenceContext.class
    jar:file:/C:/Users/emna/.m2/repository/javax/persistence/persistence-api/1.0.2/persistence-api-1.0.2.jar!/javax/persistence/PersistenceContext.class

It was loaded from the following location:

    file:/D:/javacert/javax.persistence.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of javax.persistence.PersistenceContext

这是主班

package com.spring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "com.spring")
public class votreBanque {

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

    }

}

The package `com.spring.entitie` contain these entities

Client类:

package com.spring.entite;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.OneToMany;

import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.annotation.Id;
@Entity

public class Client implements Serializable {
    @Id @GeneratedValue
    private Long code;
    private String nom;
    private String email;
    @OneToMany(mappedBy="client",fetch=FetchType.LAZY)
    private Collection<Compte> compte;
    public Client() {

    }
    public Long getCode() {
        return code;
    }
    public void setCode(Long code) {
        this.code = code;
    }
    public String getNom() {
        return nom;
    }
    public void setNom(String nom) {
        this.nom = nom;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Collection<Compte> getCompte() {
        return compte;
    }
    public void setCompte(Collection<Compte> compte) {
        this.compte = compte;
    }
    public Client(String nom, String email) {
        super();
        this.nom = nom;
        this.email = email;
    }

}

Compte

package com.spring.entite;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.springframework.data.annotation.Id;
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE_CPT",discriminatorType=DiscriminatorType.STRING,length=2)
public class Compte implements Serializable {
    @Id
    private String codeCompte;
    private Date dateCreation;
    private double solde;
    @ManyToOne
    @JoinColumn(name="CODE_CLI")
    private Client client;
    @OneToMany(mappedBy="compte")
    private Collection<Operation> operations;
    public Compte() {
        super();

    }
    public String getCodeCompte() {
        return codeCompte;
    }
    public void setCodeCompte(String codeCompte) {
        this.codeCompte = codeCompte;
    }
    public Date getDateCreation() {
        return dateCreation;
    }
    public void setDateCreation(Date dateCreation) {
        this.dateCreation = dateCreation;
    }
    public double getSolde() {
        return solde;
    }
    public void setSolde(double solde) {
        this.solde = solde;
    }
    public Client getClient() {
        return client;
    }
    public void setClient(Client client) {
        this.client = client;
    }
    public Collection<Operation> getOperations() {
        return operations;
    }
    public void setOperations(Collection<Operation> operations) {
        this.operations = operations;
    }
    public Compte(String codeCompte, Date dateCreation, double solde, Client client) {
        super();
        this.codeCompte = codeCompte;
        this.dateCreation = dateCreation;
        this.solde = solde;
        this.client = client;
    }

}

扩展Compte的类CompteCourant

package com.spring.entite;

import java.util.Date;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("CC")
public class CompteCourant extends Compte {
    private double decouvert;

    public CompteCourant(double decouvert) {
        super();
        this.decouvert = decouvert;
    }

    public CompteCourant(String codeCompte, Date dateCreation, double solde, Client client, double decouvert) {
        super(codeCompte, dateCreation, solde, client);
        this.decouvert = decouvert;
    }

    public double getDecouvert() {
        return decouvert;
    }

    public void setDecouvert(double decouvert) {
        this.decouvert = decouvert;
    }




}

CompteEpargneCompte另一个子类:

package com.spring.entite;

import java.util.Date;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("CE")
public class CompteEpargne extends Compte {
    private double taux;

    public double getTaux() {
        return taux;
    }

    public void setTaux(double taux) {
        this.taux = taux;
    }

    public CompteEpargne() {
        super();

    }

    public CompteEpargne(String codeCompte, Date dateCreation, double solde, Client client, double taux) {
        super(codeCompte, dateCreation, solde, client);
        this.taux = taux;
    }

}

该类Operation

package com.spring.entite;
import java.io.Serializable;
import java.util.*;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.springframework.data.annotation.Id;
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE_OP",discriminatorType=DiscriminatorType.STRING,length=1)
public abstract class Operation implements Serializable {
    @Id @GeneratedValue
    private Long numero;
    private Date dateOperation;
    private double montant;
    @ManyToOne
    @JoinColumn(name="CODE_CPTE")
    private Compte compte;
    public Operation() {
        super();

    }
    public Long getNumero() {
        return numero;
    }
    public void setNumero(Long numero) {
        this.numero = numero;
    }
    public Date getDateOperation() {
        return dateOperation;
    }
    public void setDateOperation(Date dateOperation) {
        this.dateOperation = dateOperation;
    }
    public double getMontant() {
        return montant;
    }
    public void setMontant(double montant) {
        this.montant = montant;
    }
    public Compte getCompte() {
        return compte;
    }
    public void setCompte(Compte compte) {
        this.compte = compte;
    }
    public Operation(Date dateOperation, double montant, Compte compte) {
        super();
        this.dateOperation = dateOperation;
        this.montant = montant;
        this.compte = compte;
    }


}

Retrait类扩展了Operation

package com.spring.entite;

import java.util.Date;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("R")
public class Retrait extends Operation {

    public Retrait() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Retrait(Date dateOperation, double montant, Compte compte) {
        super(dateOperation, montant, compte);
        // TODO Auto-generated constructor stub
    }




}

也扩展了Operation Versement类:

package com.spring.entite;

import java.util.Date;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("V")
public class Versement extends Operation {

    public Versement() {
        super();

    }

    public Versement(Date dateOperation, double montant, Compte compte) {
        super(dateOperation, montant, compte);

    }

}

package com.spring.dao

  package com.spring.dao;
        import com.spring.entite.Client;
        import org.springframework.data.jpa.repository.JpaRepository;

        public interface clientRepository extends JpaRepository<Client, Long>{

        }






   package com.spring.dao;

        import com.spring.entite.Compte;
        import org.springframework.data.jpa.repository.JpaRepository;

        public interface compteRespository extends JpaRepository<Compte, String> {

        }




      package com.spring.dao;
        import com.spring.entite.Employe;
        import org.springframework.data.jpa.repository.JpaRepository;

        public interface employeRepository extends JpaRepository<Employe, Long> {

        }




      package com.spring.dao;

        import com.spring.entite.Groupe;
        import org.springframework.data.jpa.repository.JpaRepository;

        public interface groupeRepository extends JpaRepository<Groupe, Long> {

        }






   package com.spring.dao;


        import com.spring.entite.Operation;
        import org.springframework.data.jpa.repository.JpaRepository;

        public interface operationRepository extends JpaRepository<Operation, String> {

        }


package com.spring.metier
package com.spring.metier;

import com.spring.entite.*;
import java.util.*;
public interface ClientMetier {
    public Client saveClient(Client c);
    public List<Client> listeClient();

}

com.spring.metier

package com.spring.metier;
import com.spring.entite.*;
import java.util.*;
public interface ClientMetier {
    public Client saveClient(Client c);
    public List<Client> listeClient();

}

class clientMetierImplementation类如何实现ClientMetier

  package com.spring.metier;

    import java.util.List;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;

    import com.spring.dao.clientRepository;
    import com.spring.entite.Client;
    @Service
    public class clientMetierImplementation implements ClientMetier {

        @Autowired(required=true)
        private clientRepository clientrepository;

        @Override
        public Client saveClient(Client c) {

            return clientrepository.save(c);
        }

        @Override
        public List<Client> listeClient() {
            return clientrepository.findAll();
        }

    }


package `com.spring.services`

package com.spring.services;

    import java.util.List;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;

    import com.spring.entite.Client;
    import com.spring.metier.ClientMetier;

    @RestController
    @Component
    public class ClientRestService {
        @Autowired(required=true)
        private ClientMetier clientmetier;
          @RequestMapping(value="/clients",method=RequestMethod.POST)

        public Client saveClient(@RequestBody Client c) {
            return clientmetier.saveClient(c);
        }
         @RequestMapping(value="/clients",method=RequestMethod.GET)     
        public List<Client> listeClient() {
            return clientmetier.listeClient();
        }

    }

我花了一天的时间寻找解决方案,但是我找不到导致错误的原因。

该错误是不言自明的:

更正应用程序的类路径,以使其包含单个兼容版本的javax.persistence.PersistenceContext。

我会将Maven用作依赖项的唯一来源,即从类路径中删除D:/javacert/javax.persistence.jarD:/javacert/hibernate-jpa-2.1-api-1.0.0.final.jar ,仅使用来自Maven的依赖。 您正在使用IDE进行构建吗? 如果是,请更正类路径。 如果不是,请除去pom.xml以外的任何其他依赖项。

您的应用程序正在多个位置找到javax.persistence.PersistenceContext.synchronization() ,这是解决此错误的方法

  1. 删除所有jar,然后重新导入。
  2. 尝试在项目的源目录中执行mvn clean install
  3. 尝试删除M2存储库并再次构建项目。

C:/用户/emna/.m2

  1. 尝试删除外部包含的jar(pom.xml除外)

D:/javacert/javax.persistence.jar

  1. 要么

D:/javacert/hibernate-jpa-2.1-api-1.0.0.final.jar

更新:

错误

org.hibernate.AnnotationException:未为实体com.sid.entities.Operation指定标识符

建议它找不到可以唯一标识您的操作实体的标识符。 这意味着您需要在操作类中放置javax.persistence.Id包的@Id批注。

通过查看您的代码

  1. 我看到您使用的是包org.springframework.data.annotation.Id @Id而不是包javax.persistence.Id
  2. 尝试更改软件包,因为休眠需要javax.persistence软件包的@Id注释。

另外,如果您对我的回答有帮助,也请进行投票。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM