Spring Boot выдает ошибку при создании bean-компонента с именем entityManagerFactory - PullRequest
0 голосов
/ 25 мая 2020
• 1000 по какой-то причине Spring просто не может правильно настроить bean-компонент, какие-либо предложения?

класс модели:

package com.example.demo.models;


import java.util.Set;

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

import org.springframework.stereotype.Component;



@Entity
@Table(name="Strain")
@Component
public class Strain {


    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="strain_id")
    private int id;
    private String name;
    private String StrainType;
    private Set<Strain> parents;


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


    public Strain(int id, String name, String strainType, Set<Strain> parents) {
        super();
        this.id = id;
        this.name = name;
        StrainType = strainType;
        this.parents = parents;
    }




    public Strain(String name, String strainType, Set<Strain> parents) {
        super();
        this.name = name;
        StrainType = strainType;
        this.parents = parents;
    }


    public int getId() {
        return id;
    }


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


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public String getStrainType() {
        return StrainType;
    }


    public void setStrainType(String strainType) {
        StrainType = strainType;
    }


    public Set<Strain> getParents() {
        return parents;
    }


    public void setParents(Set<Strain> parents) {
        this.parents = parents;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((StrainType == null) ? 0 : StrainType.hashCode());
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((parents == null) ? 0 : parents.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;
        Strain other = (Strain) obj;
        if (StrainType == null) {
            if (other.StrainType != null)
                return false;
        } else if (!StrainType.equals(other.StrainType))
            return false;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (parents == null) {
            if (other.parents != null)
                return false;
        } else if (!parents.equals(other.parents))
            return false;
        return true;
    }


    @Override
    public String toString() {
        return "Strain [id=" + id + ", name=" + name + ", StrainType=" + StrainType + ", parents=" + parents + "]";
    }




}

контроллер:


package com.example.demo.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.models.Strain;
import com.example.demo.services.StrainService;

@RestController
public class StrainController {

@Autowired
private StrainService ss;

    @GetMapping(value = "/strains")
    @ResponseBody 
    public List<Strain> findAll() {
        return ss.findAll();
    }

    @GetMapping("/strains/{id}")
    @ResponseBody
    public ResponseEntity<Strain> findById(@PathVariable("id") int id) {
         Strain m = ss.findById(id);

        return ResponseEntity.status(HttpStatus.OK).body(m);
    }
    @PostMapping("/strain")
    @ResponseBody
    public ResponseEntity<Strain> save(@RequestBody Strain m) {

        return ResponseEntity.ok(ss.save(m));
    }
    @DeleteMapping("/strain")
    @ResponseBody
    public ResponseEntity<Strain> deleteByName(@RequestBody String name) {
        return ResponseEntity.ok(ss.deleteByName(name));
    }

}


ServiceClass:

package com.example.demo.services;

import java.util.List;

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

import com.example.demo.models.Strain;
import com.example.demo.repositories.StrainRepository;



@Service
public class StrainService {    

@Autowired
private StrainRepository dao;

public Strain save(Strain s){                   
    return dao.save(s);     
}

public void delete(Strain s){
     dao.delete(s);
}

public Strain findById(int id) {
    return dao.findById(id);
}
public List<Strain> findAll() {
    return dao.findAll();
}
public Strain findByName(String name) {
    return dao.findByName(name);
}
public int findIdByName(String name) {
    return dao.findIdByName(name);
}
public Strain deleteByName(String name) {
    return dao.deleteByName(name);
}
public List<Strain> findAllByStrainType(String name){
    return dao.findAllByStrainType(name);
}
public boolean existStrainByName(String name) {
    return dao.existStrainByName(name);
}

}

класс репо:

package com.example.demo.repositories;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import com.example.demo.models.Strain;


@Repository
public interface StrainRepository extends JpaRepository<Strain, Integer> {




    public Strain save(Strain s);
    public void delete(Strain s);
    public Strain findById(int id);
    public Strain findByName(String name);
    public Strain deleteByName(String name);
    public List<Strain> findAll();
    public List<Strain> findAllByStrainType(String name);
    public boolean existStrainByName(String name);
    public int findIdByName(String name);
}

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 https://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>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>Weedepedia2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Weedepedia2</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>


       <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>



        <dependency>
            <groupId>org.hibernate.orm</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.0.0.Alpha5</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.12</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency> 
    </dependencies>

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

</project>

кажется, что это связано с гибернацией, потому что когда я удаляю аннотацию @Entity, она переходит к другой ошибке, которая должна сделать с классом, который не управляется для сохранения

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

Чтобы получить EntityManagerFactory, автоматически настраиваемую Spring Boot, вам необходимо использовать зависимость spring-boot-starter-data-jpa. В вашем случае вы используете простой spring-data-jpa

Замените

       <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate.orm</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.0.0.Alpha5</version>
        </dependency>

на

   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.3.0.RELEASE</version>
    </dependency>

И убедитесь, что у вас есть сведения о подключении к базе данных в свойствах вашего приложения. файл.

См. Ниже фрагмент application.yml для PostgreSQL соединения

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: postgres

Обновление

Также, как указал @Mohammad Al Alwa отображение сущностей выглядит не очень хорошо. Типичный случай, когда объект ссылается на одного родителя.

В вашем случае это будет

@OneToOne
private Strain parent;

А в StrainRepository вам нужно изменить

public boolean existStrainByName(String name);

на

public boolean existsByName(String name);

Обратите внимание, что вы можете сгенерировать таблицы базы данных из своих объектов, если вы предоставите spring.jpa.hibernate.ddl-auto свойство

См. Ниже

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: postgres
  jpa:
    hibernate:
      ddl-auto: create-only
0 голосов
/ 25 мая 2020

Hibernate не может сопоставить объект с таблицей, потому что вы используете поле коллекции Set<Strain> parents без определения сопоставления отношений (ie. @OneToMany или @ManyToMany).

Кроме того, это не рекомендуется использовать собственный тип int для идентификатора.

...