问题描述
我计划通过 Spring Boot 2.1.7 在一个应用程序(某些实体JPA和其他JDBC)中使用 Spring Data JPA和JDBC 存储库。
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;
...
}
正在运行的应用程序出现错误:
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**];
我尝试了没有Spring Data JDBC的Spring Boot测试应用程序 =>没问题
我尝试了spring.main.allow-bean-deFinition-overriding = true =>没问题
因此,Spring Data通过一个存储库接口(接口名称为userRepository2)创建了 2个存储库bean(JPA和JDBC)。 我不能为此2个回购bean设置不同的名称,不能使用spring.main.allow-bean-deFinition-overriding = true。
为每个存储库/实体选择JPA / JDBC的最佳实践是什么?
PS:发现@EnableJdbcRepositories
具有basePackages属性,但我不确定这是个好主意
解决方法
这几乎可以肯定是由于较旧版本的Spring Data JDBC中的一个固定错误。确保您拥有至少spring-data-jdbc
1.0.12 1.1.1 2.0.0
有关详细信息,请参见DATAJDBC-437。