英文:
BeanDefinitionOverrideException, Spring Data JPA and JDBC beans conflict
问题
我计划在一个应用程序中同时使用Spring Data JPA和JDBC存储库(一些实体使用JPA,其他使用JDBC),使用Spring Boot 2.1.7。
public interface UserRepository2 extends CrudRepository<User, Integer> {
}
@Entity
@Table(name = "userstab")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
private String email;
...
}
运行应用程序时出现错误:
无法在 null 中注册名为 'userRepository2' 的 bean。已经在 null 中定义了具有该名称的 bean,并且禁用了覆盖。
操作:
考虑为其中一个 bean 重新命名,或通过设置 **spring.main.allow-bean-definition-overriding=true** 来启用覆盖。
在 null 中定义的名为 'userRepository2' 的无效 bean 定义:无法为 bean 'userRepository2' 注册 bean 定义
[Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]];作用域=;抽象=false;lazyInit=false;autowireMode=0;dependencyCheck=0;autowireCandidate=true;primary=false;factoryBeanName=null;factoryMethodName=null;initMethodName=null;destroyMethodName=null]
已经存在一个 [Root bean: class [org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean]];
我尝试过不使用Spring Data JDBC的Spring Boot测试应用程序 => 没有问题
我尝试过在该应用程序中使用spring.main.allow-bean-definition-overriding=true => 没有问题
因此,Spring Data会从一个存储库接口创建两个存储库bean(JPA和JDBC),并且这两个bean的名称都是接口的名称(userRepository2)。
我无法为这两个存储库bean设置不同的名称,也不能使用spring.main.allow-bean-definition-overriding=true。
对于为每个存储库/实体选择JPA/JDBC,有哪些最佳实践?
附注:我找到了带有basePackages属性的@EnableJdbcRepositories
,但我不确定这是否是一个好主意。
英文:
I planned to use Spring Data JPA and JDBC repositories in one application (some entities JPA and other JDBC) with Spring Boot 2.1.7.
public interface UserRepository2 extends CrudRepository<User, Integer> {
}
@Entity
@Table(name = "userstab")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
private String email;
...
}
Running application I got the error:
The bean 'userRepository2', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting **spring.main.allow-bean-definition-overriding=true**
Invalid bean definition with name 'userRepository2' defined in null: Cannot register bean definition [Root bean: class [org.springframework.data.**jpa**.repository.support.**JpaRepositoryFactoryBean**]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'userRepository2': There is already [Root bean: class [org.springframework.data.**jdbc**.repository.support.**JdbcRepositoryFactoryBean**];
I tried Spring Boot test-application without Spring Data JDBC => no problems
I tried this application with spring.main.allow-bean-definition-overriding=true => no problems
So Spring Data creates 2 repository beans (JPA and JDBC) from one repository interface with the name of interface (userRepository2).
I can't set different names for this 2 repo beans, can't use spring.main.allow-bean-definition-overriding=true.
What are the best practices for choosing JPA/JDBC for every repository/entity?
PS: found @EnableJdbcRepositories
with basePackages property, but i am not sure that it is a good idea
答案1
得分: 1
这几乎可以确定是由于旧版Spring Data JDBC中的一个已修复错误引起的。请确保您至少拥有以下版本之一的spring-data-jdbc
:1.0.12、1.1.1、2.0.0。有关详细信息,请参见DATAJDBC-437。
英文:
This is almost certainly due to a fixed bug in older versions of Spring Data JDBC. Make sure that you have at least one of the following versions of spring-data-jdbc
1.0.12
1.1.1
2.0.0
See DATAJDBC-437 for details.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论