wake-up-neo.com

Spring-Boot: kann keine Persistenz verwenden

Ich bin Tage damit beschäftigt, und obwohl ich viel lerne, fange ich an zu verzweifeln. 

Ich habe alle Vorschläge zu dieser ausgezeichneten Frage ausprobiert: 

Kein Persistenzanbieter für EntityManager mit dem Namen

Ich hatte an einem Punkt mit der allgegenwärtigen HibernateUtil-Klasse gearbeitet, wurde aber angewiesen, hier zu einem einfachen JPA-Stil zu wechseln:

Vorschläge zur Verbesserung der Spring RESTful-Controller-Methode

Leider konnte ich die Bohnenspritze im Springboot nicht richtig zum Laufen bringen. Hier ist mein Versuch:

Spring JPA (Hibernate) Keine qualifizierende Bean vom Typ: javax.persistence.EntityManagerFactory

Nach langer Arbeit auf diesem Weg bekam ich schließlich einen Entity-Manager mit Nullen. Ich fand das und fing an zu glauben, dass es nicht funktionieren könnte:

JPA2 in Tomcat 6 verwenden: @PersitenceContext funktioniert nicht, EntityManager ist null

Mir scheint, als sollte die EntityManagerFactory unbedingt eine Bean in dem Kontext sein, in dem Spring-Boot erstellt wird, aber ... was auch immer. Ich würde denken, dass dies zumindest funktionieren würde:

Anwendungsstart:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

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

Regler:

@Controller
public class GetController {

    private static final String PERSISTENCE_UNIT_NAME = "cpJpaPu";  

    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public @ResponseBody User getUser(@RequestParam(value="id", required=true) int id) {
        User user = null;

        EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = emf.createEntityManager();
        UserDAO userDao = new UserDAO();
        userDao.setEntityManager(em);
        user = userDao.load(id);

        return user;
    }
}

DAO:

public class UserDAO {

    public EntityManager entityManager;

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }   

    public void insert(User user) {
        entityManager.persist(user);
    }

    public User load(int id) {
        return entityManager.find(User.class, id);
    }
}

/src/main/resources/persistence.xml:

<persistence xmlns="http://Java.Sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
  <persistence-unit name="cpJpaPu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.mydomain.User</class>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
      <property name="hibernate.show_sql" value="false"/>
      <property name="hibernate.connection.username" value="user"/>
      <property name="hibernate.connection.password" value=""/>
      <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/mydb"/>
    </properties>
  </persistence-unit>
</persistence>

Und es funktioniert nicht:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named cpJpaPu
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:61)
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:39)
    com.mydomain.GetController.getUser(GetController.Java:25)
    Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    Java.lang.reflect.Method.invoke(Unknown Source)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.Java:214)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.Java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.Java:104)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.Java:748)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.Java:689)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.Java:83)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:947)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:878)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:946)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.Java:822)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.Java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.Java:108)

--- Hinzugefügt Info ---

POM:

<?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>com.mygroup</groupId>
    <artifactId>myartifact</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>0.5.0.M6</version>
    </parent>

    <dependencies>
        <!--  Spring framework -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--  Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <!-- Must override version or face stack traces -->
            <version>4.3.0.Final</version>
        </dependency>

        <!-- Spring ORM, works with Hibernate -->   
        <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-orm</artifactId>
        </dependency>

        <!--  Spring implementation of Jackson for RESTful JSON -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>         
        </dependency>

        <!--  JDBC -->
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901.jdbc4</version>
        </dependency>

        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>

        <!-- Prevent logging conflicts -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
            <scope>compile</scope>
            <exclusions>                
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions> 
        </dependency>
    </dependencies>

    <properties>
        <start-class>com.cloudfordev.controlpanel.Application</start-class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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

            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>          
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/libs-snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/libs-snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>
12
Lurk21

Diese Frage wurde hier mit einer viel besseren Architektur beantwortet:

Spring JPA (Hibernate) Keine qualifizierende Bean vom Typ: javax.persistence.EntityManagerFactory

1
Lurk21

spring Boot liest die Datei persistence.xml nicht standardmäßig. Weitere Informationen finden Sie im Dokument hier

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html

wenn Sie die persistence.xml-Datei weiterhin verwenden möchten, fügen Sie der AppConfig-Klasse den folgenden Code hinzu

@Bean
public LocalEntityManagerFactoryBean entityManagerFactory(){
     LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
    factoryBean.setPersistenceUnitName("cpJpaPu");
    return factoryBean;
}
6
vedat

Es gibt einige Funktionen von JPA, die leider nur in der XML-Konfiguration funktionieren, aber in Ihrer kann ich nichts dergleichen sehen. Ich glaube nicht, dass persistence.xml standardmäßig geladen ist, daher ist dies wahrscheinlich das Problem. Warum gehen Sie also nicht auf den Fluss und verwenden Java und application.properties, um den Entity Manager zu konfigurieren? Das JPA-Beispiel von Spring Boot enthält alles, was Sie benötigen, um loszulegen. Es verwendet Spring Data JPA, während Ihr Code nur die JPA-APIs verwendet. Sie können jedoch leicht auf diese Ebene zurückgreifen, indem Sie lediglich die Spring Data-Abhängigkeiten im Beispiel entfernen.

Kürzlich erstellte Spring Boot-Snapshots verfügen über eine Funktion, mit der Sie eine eigene LocalEntityManagerFactoryBean erstellen können, sodass Sie eine benutzerdefinierte XML-Konfiguration hinzufügen können. Bis M7 müssen Sie jedoch die gesamte JPA-Konfiguration manuell vornehmen, wenn Sie eine benutzerdefinierte EntityManager benötigen.

N.B. Sie verwenden Abhängigkeitsinjektion in Ihrem Controller nicht wirklich sehr effektiv - warum sollten Sie nicht einfach die Variable UserDao injizieren?

1
Dave Syer

Die persistence.xml sollte sich im META-INF-Verzeichnis befinden

/src/main/resources/META-INF/persistence.xml

1
xi.lin

Ich habe dieses Problem behoben, nachdem alle Ordner des Ruhezustand-Kerns unter dem folgenden Verzeichnis gelöscht wurden: .m2\repository\org\hibernate\hibernate-core

und baute meine Projekte wieder auf.

Jetzt funktioniert es gut unter Spring Boot 2.0.4.RELEASE. Und ich bin mir sicher, dass die Datei/main/resources/META-INF/persistence.xml geladen wird, ohne dass LocalEntityManagerFactoryBean Bean eingespritzt wird.

Bevor ich sie lösche, befinden sich 4 Versionen von Hibernate-Core im obigen Ordner. Sie sind "4.3.6"/"5.0.12"/"5.2.17"/"5.3.4".

Nachdem ich sie gelöscht habe, gibt es nach dem Umbau meiner Projekte "5.0.12"/"5.2.17"/"5.3.4".

Und wenn ich in dieses Problem eintauche, habe ich festgestellt, dass der Ordner "hibernate-core-5.2.17.Final.jar" im vorherigen Ordner "5.2.17" größer als der normale Ordner ist und keinen "hibernate-core-5.2.17" enthält End.jar.sha1 ".

Dies kann durch ein schlechtes Netzwerk oder einen schlechten Spiegel verursacht werden.

0
capcom923