Java Spring动态JPA存储库类型
我需要从XML文件中填充大约30个表。我想用JPA来达到这个目的 现在我有30个用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
@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=)。不管怎样,你让我头脑清醒了,谢谢)谢谢你,我要做很多复制粘贴工作;)别忘了接受/支持那些帮助你的答案。。。