【问题标题】:Consider defining a bean of type EntityManagerFactory Spring boot考虑定义一个 EntityManagerFactory Spring boot 类型的 bean
【发布时间】:2019-12-05 05:02:08
【问题描述】:

我正在使用 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);
    }
}

我该如何解决这个问题?

【问题讨论】:

  • 您没有 Spring Boot 应用程序;您没有使用 @EnableAutoConfiguration@SpringBootApplication (包含它)。另请注意,您正在重新发明 Spring Data;它会自动为您创建整个BookDaoImpl(请参阅CrudRepository)。
  • 我添加了@SpringBootApplication,但现在查看org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
  • 您包含了 MySQL 驱动程序;您是否为数据库添加了 Spring Boot 属性?
  • 在资源中是 -> application.properties spring.datasource.url=jdbc:mysql://localhost:3306/library?useSSL=false spring.datasource.username=root spring.datasource.password=admin spring.jpa.hibernate.ddl-auto=create spring.datasource.tomcat.initial-size=5

标签: java mysql spring hibernate spring-boot


【解决方案1】:

我给 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>

一切正常

【讨论】:

    【解决方案2】:

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

    在 Spring Boot 中,您需要创建一个将由所有应用程序使用的数据源 bean。通常你不需要使用 EntityManager 和 EntityManagerFactory,这是因为服务器和 Spring Data 都会创建它们,你只需要使用 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/

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 2022-06-17
      • 2022-01-19
      • 2017-11-14
      • 2019-01-27
      • 2021-11-25
      • 2017-03-16
      • 2022-09-28
      • 2018-08-03
      相关资源
      最近更新 更多