Spring动态JPA仓库类型

3
我有大约30个表需要从XML文件中填充,我想使用JPA来实现这个目的。
现在我有30个带有@Entity注释的类,配置扫描实体和存储库;
此外,我还有:
@Repository
public interface MyRepository extends JpaRepository<MyEntity1, Long> {
}

还有(一些控制器):

@Autowired
public MyRepository myRepository;
...
...
MyEntity1 entity = new MyEntity(...);
myRepository.save(entity);

对于一个 @Entity 来说,这个方法可以正常运行,但是如果我有30个这样的实体类,我需要定义30个仓库吗?

我认为我可以尝试这样做:

@Repository
public interface MyRepository<T> extends JpaRepository<T, Long> {
}

并且:
@Autowired
public MyRepository<MyEntity1> myRepository1;
@Autowired
public MyRepository<MyEntity2> myRepository2;

但是出现了错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myRepository1': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object

不要忘记接受/投赞成票帮助过你的答案。 - Cepr0
3个回答

4

尝试以下方法:

所有实体的基类:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
}

实体:

@Entity
public class Entity1 extends BaseEntity {

    private String name;
}

@Entity
public class Entity2 extends BaseEntity {

    private String name;
}

一个常见的代码存储库:

public interface BaseEntityRepo extends JpaRepository<BaseEntity, Long> {
}

用法:

public class BaseEntityRepoTest extends BaseTest {

    @Autowired
    private BaseEntityRepo repo;

    @Test
    public void baseEntityTest() throws Exception {

        BaseEntity entity1 = new Entity1("entity1");
        BaseEntity entity2 = new Entity2("entity2");

        repo.save(entity1);
        repo.save(entity2);

        List<BaseEntity> entities = repo.findAll();
        assertThat(entities).hasSize(2);

        entities.forEach(System.out::println);
    }
}

这个对MongoDB也适用吗? - chaitanya

3
很遗憾您不能这样做,您将不得不编写30个单独的存储库。但是,如果实体共享单个表继承,则可以编写通用存储库。(请参见在Spring Data JPA存储库中使用泛型的答案)您的代码试图创建一个存储库,其中共享继承在Object类上,这不是@Entity,因此会出现异常。
此外,另一个小注释是,您不需要使用@Repository对存储库进行注释。如果正确配置了Spring data,则自动将其注册为bean。

谢谢。我尝试修复无法自动装配存储库的问题时,添加了@Repository注释,但错误是我拼错了要扫描的repos包名称 =)。无论如何,你让我豁然开朗,谢谢)。 - Frankie Drake

2
据我所知,您尝试的是不可能的。Spring Data JPA需要每个实体类型一个接口来创建其存储库,因为Spring Data JPA将创建查询实现。因此,建议您每个实体都有一个存储库,这样将来您可以添加复杂的findByXXX方法。

谢谢,我将会有很多复制粘贴的工作;) - Frankie Drake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接