Spring Boot - 存储库字段需要一个名为“entityManagerFactory”的 bean,但无法找到
Posted
技术标签:
【中文标题】Spring Boot - 存储库字段需要一个名为“entityManagerFactory”的 bean,但无法找到【英文标题】:Spring Boot - repository field required a bean named 'entityManagerFactory' that could not be found 【发布时间】:2017-06-30 03:53:00 【问题描述】:我正在开发一个 Spring Boot 应用程序,在启动服务器时遇到了这个错误。我不确定我是否错误地定义了任何注释或缺少任何依赖项。任何帮助将不胜感激。
主类:
@SpringBootApplication
public class FantasyManagerApplication
public static void main(String[] args)
SpringApplication.run(FantasyManagerApplication.class, args);
LeagueService.java:
@Service
public class LeagueService
@Autowired
private LeagueRepository leagueRepository;
@Autowired
private PlayerRepository playerRepository;
@Autowired
private TeamRepository teamRepository;
/**
* Returns a list of all the leagues in the database
* @return List<League>
*/
public List<League> getAllLeagues()
List<League> leagues = new ArrayList<>();
leagueRepository.findAll()
.forEach(leagues::add);
return leagues;
/**
* Find details for a particular League
* @param leagueId
* @return League
*/
public League getLeagueById(long leagueId)
return leagueRepository.findOne(leagueId);
/**
* Find the leagueSettings for a particular League
* @param leagueId
* @return LeagueSettings
*/
public LeagueSettings getLeagueSettingsById(long leagueId)
return leagueRepository.findOne(leagueId).getLeagueSettings();
/**
* Returns a list of all the Team's in the League
* @param leagueId
* @return List<Team>
*/
public List<Team> getTeamsInLeague(long leagueId)
List<Team> teams = new ArrayList<>();
leagueRepository.findOne(leagueId).getTeams()
.forEach(teams::add);
return teams;
/**
* Returns a list of all the Player's in the League
* @param leagueId
* @return List<Player>
*/
public List<Player> getPlayersInLeague(long leagueId)
List<Player> players = new ArrayList<>();
leagueRepository.findOne(leagueId).getPlayers()
.forEach(players::add);
return players;
/**
* Returns a list of all the User's in the League
* @param leagueId
* @return List<User>
*/
public List<User> getUsersInLeague(long leagueId)
List<User> users = new ArrayList<>();
leagueRepository.findOne(leagueId).getUsers()
.forEach(users::add);
return users;
/**
* Add League to database
* @param league
*/
public void addLeague(League league)
leagueRepository.save(league);
/**
* Assign LeagueSettings for a League
* @param userId
* @param leagueSettings
*/
public void assignLeagueSettings(long leagueId, LeagueSettings leagueSettings)
League league = leagueRepository.findOne(leagueId);
league.setLeagueSettings(leagueSettings);
leagueRepository.save(league);
/**
* Assign a Player to a League and vice versa
* @param leagueId
* @param playerId
*/
public void assignPlayerToLeague(long leagueId, long playerId)
//Find the league and player from the database
League league = leagueRepository.findOne(leagueId);
Player player = playerRepository.findOne(playerId);
//Get the players that the league already has
List<Player> players = new ArrayList<>();
players = league.getPlayers();
//Get the leagues that the player is part of
List<League> leagues = new ArrayList<>();
leagues = player.getLeagues();
//Assign player to this league and vice versa
leagues.add(league);
players.add(player);
league.setPlayers(players);
player.setLeagues(leagues);
//Update changes in database
playerRepository.save(player);
leagueRepository.save(league);
/**
* Assign a Team to a League and vice versa
* @param leagueId
* @param teamId
*/
public void assignTeamToLeague(long leagueId, long teamId)
//Find the league and player from the database
League league = leagueRepository.findOne(leagueId);
Team team = teamRepository.findOne(teamId);
//Get the teams that are already in the league
List<Team> teams = new ArrayList<>();
teams = league.getTeams();
//Assign team to this league and vice versa
teams.add(team);
league.setTeams(teams);
team.setLeague(league);
//Update changes in database
teamRepository.save(team);
leagueRepository.save(league);
/**
* Edit the details for a particular League
* @param league
*/
public void updateLeague(League league, long leagueId)
leagueRepository.save(league);
/**
* Delete the League from the database
* @param leagueId
*/
public void deleteLeague(long leagueId)
leagueRepository.delete(leagueId);
LeagueRepository.java
public interface LeagueRepository extends CrudRepository<League, Long>
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>
<groupId>com.dheeraj</groupId>
<artifactId>fantasy-manager</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>fantasy-manager</name>
<description>Fantasy Manager Application</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.3.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field leagueRepository in com.dheeraj.service.LeagueService required a bean named 'entityManagerFactory' that could not be found.
Action:
Consider defining a bean named 'entityManagerFactory' in your configuration.
【问题讨论】:
看起来您没有运行 JPA 自动配置。确保你有启动器和数据库连接。 @chrylis - 如何让 JPA 自动配置运行?我已经在 application.properties 中建立了到 mysql 数据库的连接 您的 Hibernate 依赖项不匹配。只需删除版本号,让 Boot 管理它们。 【参考方案1】:spring-boot-starter-data-jpa 将引入您需要的所有休眠依赖项。使用 Spring Boot 1.5.1 版,它将引入 hibernate-core:5.0.11 和 hibernate-entitymanager:5.0.11。除了不必要之外,您的休眠依赖版本不匹配,我猜这就是导致错误的原因。
尝试从您的 pom.xml 中删除这些依赖项。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.3.Final</version>
</dependency>
【讨论】:
我有一个类似的错误,我自己也包含了hibernate。但是,根据mvn dependency:tree
我有spring-boot:jar:2.0.3.
和spring-boot-starter-data-jpa:2.0.3.
只包括hibernate-core
但不包括hibernate-entitymanager
。
@NicCottrell Cottrell 我在使用 Spring Boot 2.0.3 时遇到了同样的问题。我想知道你是如何为自己修好的?
@NicCottrell ,@Ajay kumar ;我也遇到了同样的问题并尝试了所有可能的解决方案,但没有成功。请告诉我你是如何推进的?【参考方案2】:
试试这些依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
而不是:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.3.Final</version>
</dependency>
【讨论】:
【参考方案3】:Hibernate-core 5.2.0 在处理收集时出现 Spring Data JPA 问题。 当您使用 Spring Data JPA 时,Hibernate-core 5.2.1 及更高版本可以使用 Spring Data JPA。
从休眠 5.2.0 开始。不再需要休眠实体管理器。
所以尝试改变:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.4.Final</version>
</dependency>
到这个版本:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version> 5.2.1.Final</version>
</dependency>
这为我解决了问题。
【讨论】:
【参考方案4】:问题可能是由于版本不匹配。可以通过像这样指定依赖来解决问题(因为没有提到版本,所以它是自动管理的)
<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-web</artifactId>
</dependency>
</dependencies>
【讨论】:
【参考方案5】:尝试从
中删除您的依赖项 ~/.m2/repository (Linux) C:/Users/your_user/.m2/repository (Windows)并通过 IDE 的 update dependencies 功能或通过从项目文件夹运行 mvn install 进一步更新项目依赖项。
【讨论】:
【参考方案6】:我又遇到了这个问题。我所做的是改变 pom 依赖。
来自 spring-data-jpa
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
到 spring-boot-starter-data-jpa
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
没有额外的休眠相关依赖。
【讨论】:
以上是关于Spring Boot - 存储库字段需要一个名为“entityManagerFactory”的 bean,但无法找到的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Boot 存储库配置公开超类的 Id
具有 MappedSuperclass 和子类的 Spring Data 存储库的 Spring Boot 自定义实现
字段存储库需要一个名为“entityManagerFactory”的 bean,但无法找到
没有名为“mongoTemplate”的 bean 可用。 Spring Boot + MongoDB
使用 elasticSearch 和 Spring Boot 创建 bean 时出错
无法解析外部依赖 org.springframework.boot:spring-boot-starter: 因为没有定义存储库