java—使用spring处理许多类似数据库表时的最佳实践

ih99xse1  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(346)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

14小时前关门了。
改进这个问题
我在一个空间数据库中有数百个表,用于各种功能。这些表中的每一个都有公共字段,如id、name、geometry、dateadded等,还有许多特定于每个给定表的唯一字段。
我的应用程序将接收需要添加到数据库正确表中的数据行。有时我也需要更新一行,但我只需要按公共属性进行查询。
我想知道是否有一个“最佳实践”的方法来实现这个功能使用springboot。
我目前的方法有一种不好的代码味道
目前,我有一个工作原型使用的功能,我将在最后的应用程序中需要的一小部分。然而,到目前为止,我的方法似乎非常冗长,闻起来不对劲。我相信一定有更好的办法!
目前我有:
@Entity 为每个特征初始化(每个特征扩展一个用 @MappedSuperclass 这样我就不会重复与公共字段相关的代码)。
一个spring数据jpa存储库 @Entity 班级。除了findbyidandversiondate查询之外,它们没有真正的代码。
@Service 类,该类处理根据接收的数据调用正确的存储库。
这种方法是可行的,但最终我将得到大约100个基本相同的存储库接口。在我看来,应该可以有某种类型的通用存储库,我可以将一个类定义传递到其中,以确定应该将数据添加到哪个表中?
我不喜欢SpringDataJPA。我想如果我退一步,只使用hibernate(可能是一个通用的dao或其他什么?),这会更容易。如果是这样的话,请随时告诉我!
任何指点都将不胜感激。谢谢!

jgwigjjp

jgwigjjp1#

Spring解决方案

你可以用 Inheritance.TABLE_PER_PAGE 你的超级课堂策略,比如:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class SuperA {
}

通过你的 SuperARepository ,可以存储和检索所有子类。
一个问题是,当您查询以查找对象时,hibernate对所有表中的所有数据执行联合查询。在您的案例中,它可能会带来很大的性能开销。
另一个问题是当您查询一个子类(比如 SubA1 ),您仍然收到 SuperA 你需要向下转换才能访问实际的类。

jpa解决方案

在这种情况下,我建议使用jpa(jpa是一种规范,hibernate是jpa提供者之一)。最好使用通用的jpa接口,而不是特定于hibernate的接口。您提到了一个通用dao,这是一个很好的方法。
在jpa中,使用 @MappedSuperclass 是最佳的。你只要用 EntityManager 发出查询。
唯一的潜在问题是,如果需要在不知道对象类型的情况下查询对象。但是,我假设您必须知道类型,因为这些是数据库中的不同表。
例如:

// in Spring Boot it's easy to get access to EntityManager
@PersistenceContext
EntityManager entityManager

// you need to annotate your methods/class with @Transactional

// insert a new object, any entity
entityManager.persist(object);

// update an object, any entity
entityManager.merge(object);

// find an object, you need to specify a class
// but no need to downcast as it was in Spring repo (!)
SubA1 found = entityManager.find(SubA1.class, id);

相关问题