(CRUD)大量JPA类的存储库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(CRUD)大量JPA类的存储库相关的知识,希望对你有一定的参考价值。
我可以通过在相应的JPA类A上定义接口来创建存储库,如下所示:
public interface ARepository extends CrudRepository<A, Long>
{
}
我可以在我的控制器(例如)中使用它
@Autowired
private ARepository aRepository;
并且可以做这样的事情:
aRepository.save(..);
aRepository.findAll();
..
到目前为止没问题。
但我的问题是我有ca. 500个JPA类,需要访问每个表,这意味着以上述方式定义500个存储库。
那么通过一些Spring Data“魔法”动态地创建一个东西,从我的角度来看应该存在,否则上面的内容是不可能的。它看起来像this is similar to my problem。
除此之外还有一个问题与上述有关。我可以在界面中定义findBy...
方法,在后台将为这个特定属性生成一个查询方法。问题是,如果这可以以与前一个问题相关的动态方式完成,因为我有需要补充查询方法的表组。
有spring-data-generator可以自动为您生成接口。
关于你的第二个问题,我认为你不能以动态的方式完成。 Java是静态编译的,没有办法动态添加成员。可能有一个工具可以为这些方法生成代码,但如果该工具为列的所有组合生成方法,则最终会得到大量的方法。
您可以为500个类创建一个基本抽象实体,然后为此类创建一个repo。 (我认为对于项目中的每个实体来说,为BaseEntity
,id
等设置version
类是一种常见的做法)。
对于简单的回购方法(如save
,findAll
等),它将从框中工作(注意 - 实体必须具有相等的id
类型)。例如:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstarct class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
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> {
}
请注意,BaseEntity
必须有@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
,以防止为每个实体使用单表base_entity
。并且它们的id不能相交(参见@GeneratedValue(strategy = GenerationType.SEQUENCE)
)。
用法:
@RunWith(SpringRunner.class)
@SpringBootTest
public class BaseEntityRepoTest {
@Autowired private BaseEntityRepo repo;
@Before
public void setUp() throws Exception {
repo.save(asList(
new Entity1("entity1"),
new Entity2("entity2")
));
}
@Test
public void readingTest() throws Exception {
List<BaseEntity> entities = repo.findAll();
assertThat(entities).hasSize(2);
}
}
与您的第二个问题相关,您可以使用此方法:
public interface BaseEntityRepo extends JpaRepository<BaseEntity, Long> {
<T> T findById(Long id, Class<T> type);
}
用法:
@Test
public void findById() {
final Entity1 entity1 = repo.findById(1L, Entity1.class);
final Entity2 entity2 = repo.findById(2L, Entity2.class);
assertThat(entity1).isNotNull();
assertThat(entity2).isNotNull();
}
但是,您只能为基类中存在的继承实体的“公共”属性构建repo查询方法。要使此方法有效,必须将name
参数移动到BaseEntity
:
<T> List<T> findAllByNameLike(String name, Class<T> type);
以上是关于(CRUD)大量JPA类的存储库的主要内容,如果未能解决你的问题,请参考以下文章
如何在 jpa spring 存储库中使用 OrderBy?