webentwicklung-frage-antwort-db.com.de

Wie benutze ich Spring Boot mit MySQL-Datenbank und JPA?

Ich möchte Spring Boot mit MySQL und JPA einstellen. Dafür erstelle ich: Person

package domain;

import javax.persistence.*;

@Entity
@Table(name = "person")
public class Person {

@Id
@GeneratedValue
private Long id;

@Column(nullable = false)
private String firstName;

// setters and getters
}

PersonRepository

package repository;

import domain.Person;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;


public interface PersonRepository extends CrudRepository<Person, Long> {

Page<Person> findAll(Pageable pageable);
}

PersonController

package controller;

import domain.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import repository.PersonRepository;

@Controller
public class PersonController {

@Autowired
private PersonRepository personRepository;

@RequestMapping("/")
@ResponseBody
public String test() {
    Person person = new Person();
    person.setFirstName("First");
    person.setLastName("Test");
    personRepository.save(person);
    return "hello";
}
}

Klasse starten Beispiel:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Example {

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

}

Und für die Datenbankkonfiguration erstelle ich application.properties

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.globally_quoted_identifiers=true

spring.datasource.url=jdbc:mysql://localhost/test_spring_boot
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver

Ich habe also die Projektstruktur:

enter image description here

Als Ergebnis habe ich jedoch Ausnahmen:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [Example]; nested exception is Java.io.FileNotFoundException: class path resource [org/springframework/security/config/annotation/authentication/configurers/GlobalAuthenticationConfigurerAdapter.class] cannot be opened because it does not exist

Als Beispiel verwende ich: spring-boot-sample-data-jpa/pom.xml

21
TestUser

Ich habe ein Projekt wie Sie erstellt. Die Struktur sieht so aus

project structure

Die Klassen werden einfach von Ihnen kopiert.

Ich habe die application.properties folgendermaßen geändert:

spring.datasource.url=jdbc:mysql://localhost/testproject
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update

Aber ich denke, dein Problem liegt in deiner 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>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
</parent>

<artifactId>spring-boot-sample-jpa</artifactId>
<name>Spring Boot JPA Sample</name>
<description>Spring Boot JPA Sample</description>

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-Java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Überprüfen Sie diese Dateien auf Unterschiede. Hoffe das hilft

Update 1: Ich habe meinen Benutzernamen geändert. Der Link zu diesem Beispiel lautet jetzt https://github.com/Yannic92/stackOverflowExamples/tree/master/SpringBoot/MySQL

23
Yannic Klem

Beim Verschieben von Klassen in bestimmte Pakete wie Repository, Controller oder Domäne reicht der generische Code @SpringBootApplication nicht aus. 

Sie müssen das Basispaket für den Komponentenscan angeben

@ComponentScan("base_package")

Für JPA 

@EnableJpaRepositories(basePackages = "repository")

wird auch benötigt, so dass Frühjahrsdaten wissen, wo sie nach Repository-Schnittstellen suchen müssen.

3
Florin Grozea

In der Spring Boot Referenz heißt es:

Wenn eine Klasse keine Paketdeklaration enthält, wird davon ausgegangen, dass sie sich im „Standardpaket“ befindet. Von der Verwendung des "Standardpakets" wird generell abgeraten und sollte vermieden werden. Dies kann besondere Probleme für Spring Boot-Anwendungen verursachen, die Annotationen @ComponentScan, @EntityScan oder @SpringBootApplication verwenden, da jede Klasse aus jedem JAR-Objekt gelesen wird.

com
 +- example
     +- myproject
         +- Application.Java
         |
         +- domain
         |   +- Customer.Java
         |   +- CustomerRepository.Java
         |
         +- service
         |   +- CustomerService.Java
         |
         +- web
             +- CustomerController.Java

In deinen Fällen. Sie müssen scanBasePackages in der @SpringBootApplication-Annotation hinzufügen. Just like@SpringBootApplication(scanBasePackages={"domain","contorller"..})

0
linghu