Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring动态JPA存储库类型_Java_Spring_Hibernate_Spring Data Jpa - Fatal编程技术网

Java Spring动态JPA存储库类型

Java Spring动态JPA存储库类型,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,我需要从XML文件中填充大约30个表。我想用JPA来达到这个目的 现在我有30个用@Entity注释的类,它们是扫描实体和存储库的配置 我还有: @Repository public interface MyRepository extends JpaRepository<MyEntity1, Long> { } 它可以与一个@Entity配合使用,但是我应该为此定义30个存储库吗 我想我可以这样做: @Repository public interface MyRepositor

我需要从XML文件中填充大约30个表。我想用JPA来达到这个目的

现在我有30个用
@Entity
注释的类,它们是扫描实体和存储库的配置

我还有:

@Repository
public interface MyRepository extends JpaRepository<MyEntity1, Long> {
}
它可以与一个
@Entity
配合使用,但是我应该为此定义30个存储库吗

我想我可以这样做:

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

据我所知,你所尝试的是不可能的。SpringDataJPA需要为其存储库的每个实体类型提供一个接口,因为SpringDataJPA将创建一个接口


因此,建议每个实体都有一个存储库,因为它将允许您在将来添加复杂的
findByXXX
方法。

不幸的是,您不能这样做,您必须编写30个单独的存储库。但是,当实体共享单个表继承时,可以编写通用存储库。(见对的答复)

代码试图做的是创建一个存储库,其中共享继承位于类对象上,而该类对象不是@Entity,因此是异常

另外一个小提示是,您不需要使用@Repository为存储库添加注释。如果配置正确,Spring数据会自动将这些注册为bean。

尝试以下方法:

所有实体的基类

@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);
    }
}
实体

@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);
    }
}
普通回购

@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);
    }
}
公共接口BaseEntityReporto扩展了JpaRepository{
}
用法

@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);
    }
}
公共类BaseEntityReportTest扩展了BaseTest{
@自动连线
私人BaseEntityRepo;
@试验
public void baseEntityTest()引发异常{
BaseEntity entity1=新的entity1(“entity1”);
BaseEntity entity2=新的entity2(“entity2”);
回购保存(实体1);
回购保存(实体2);
列表实体=repo.findAll();
资产(实体)。hasSize(2);
entities.forEach(System.out::println);
}
}

谢谢。当我试图修复无法自动连接存储库的问题时,我添加了
@Repository
注释,但错误是我将包拼写为repos to scan=)。不管怎样,你让我头脑清醒了,谢谢)谢谢你,我要做很多复制粘贴工作;)别忘了接受/支持那些帮助你的答案。。。