BeanDefinitionOverrideException,Spring Data JPA和JDBC bean冲突

问题描述

我计划通过 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