簡體   English   中英

考慮定義類型為EntityManagerFactory的bean春季啟動

[英]Consider defining a bean of type EntityManagerFactory Spring boot

我正在使用Spring Boot並在此錯誤中運行:

組件需要找不到類型為'javax.persistence.EntityManagerFactory'的bean。

行動:

考慮在配置中定義類型為javax.persistence.EntityManagerFactory的bean。

我不知道我該怎么做,因為我會根據課程來做所有事情

我用@PersistanceUnit注入EntityManagerFactory

<?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>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>pl.javastart</groupId>
    <artifactId>spring-jpa-boot2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-jpa-boot2</name>
    <description>Spring boot app</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>
package pl.javastart.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Repository;
import pl.javastart.model.Book;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;

@Repository
public class BookDaoImpl implements BookDao {


    @PersistenceUnit
    private EntityManagerFactory emFactory;


    public BookDaoImpl(){

    }

    @Override
    public void save(Book book) {
        EntityManager entityManager = emFactory.createEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();
        entityManager.persist(book);
        tx.commit();
        entityManager.close();
    }

    @Override
    public Book get(Long id) {
        EntityManager entityManager = emFactory.createEntityManager();
        Book book = entityManager.find(Book.class, id);
        entityManager.close();
        return book;
    }
}
package pl.javastart;

import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import pl.javastart.dao.BookDao;
import pl.javastart.model.Book;

@Configuration
@ComponentScan
public class SpringJpaApplication {
    public static void main(String[] args) throws InterruptedException {


        ConfigurableApplicationContext ctx = SpringApplication.run(SpringJpaApplication.class, args);
        BookDao dao = ctx.getBean(BookDao.class);
        Book book = new Book("1234567890468", "Spring is so cool", "Javastart");
        dao.save(book);
        Thread.sleep(5000);
    }
}

我該如何解決?

您的配置在JPA服務器配置和Spring Boot之間是固定的。

在Spring Boot中,您需要創建將由所有應用程序使用的數據源bean。 通常,您既不需要使用EntityManager,也不需要使用EntityManagerFactory,這是因為服務器和Spring數據都將創建它們,並且只需要使用由Spring和將要實現的服務創建的存儲庫。

這是Spring Boot應用程序的常規配置。

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"package.where.are.your.repositorios.and.services"})
@EntityScan(basePackages = "package.where.are.your.entities")
@EnableJpaRepositories(basePackages = "package.where.are.your.repositories", entityManagerFactoryRef = "entityManagerFactory")
@EnableTransactionManagement
public class RepositoryConfiguration {

    @Bean
    public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
        // Here you can create your datasource using application.properties configuration or inject the datasource from the server application.
        JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
        bean.setJndiName("JNDI_IN_YOUR_SERVER");
        bean.setProxyInterface(DataSource.class);
        bean.setLookupOnStartup(true);
        bean.afterPropertiesSet();
        return (DataSource) bean.getObject();
    }

}

這是Spring Data的經典配置,使您能夠實現存儲庫。

一個存儲庫示例:

@Repository
public interface BuserRepository extends JpaRepository<Buser, Long> {

    @Query("SELECT t FROM Buser t WHERE t.username = :username")
    Optional<Buser> findByUsername(@Param("username") String username);

}

如果要在數據庫中保存一些新對象或更新,則所有這些都已在Spring的JpaRepository類中實現,或者還有其他要擴展的類。

請在此處閱讀有關此內容的更多信息:

https://spring.io/guides/gs/accessing-data-jpa/

我向Maven添加了兩個特權:

<dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.4.0-b180830.0359</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.8.Final</version>
        </dependency>

一切正常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM