如何在非关系数据模型上构建关系 Java 对象模型?
Posted
技术标签:
【中文标题】如何在非关系数据模型上构建关系 Java 对象模型?【英文标题】:How to build a relational Java object model over a not-that-relational data model? 【发布时间】:2018-07-20 07:56:32 【问题描述】:我目前正在研究几种解决方案,以重新设计基于该应用程序和其他正在运行的服务之间共享的数据库的 Web 应用程序。
实际应用程序使用NodeJS,基本上是在从数据库中的表中提取过多信息后处理数据。我认为这是错误的,因为我们应该只向数据库询问我们需要的数据,并限制服务器上的处理,因为这些过程意味着最终用户的加载时间很长。 所以我想我会构建一个 Java API,它会使用应用程序前端可以轻松使用的对象,并使用 Hibernate 或等效组件从数据库中提取必要的信息。
但问题是我将在其上构建此 API 的数据库虽然应该是关系型的(它是 postgreSQL),但实际上是由彼此之间不通信的表组成的:表之间没有连接,因此没有级联修改相关对象。此外,这些表不直接对应于应用程序中使用的对象。它们更像是在 Java 模型中包含其他子对象的“超级对象”。
问题是,我无法重新创建一个“更干净”的数据库,因为它被其他服务使用(顺便说一下,这可能就是它组织得如此奇怪的原因)。我应该按原样使用它,并将重新设计的应用程序映射到它。我可以被允许重新设计一些表以使它们“更具关联性”,但这对其他服务应该没有影响。这意味着要彻底重写一些 SQL 函数,我不确定它是否是一个非常有效的解决方案。话虽如此,我在编写 SQL 函数方面不是很有经验,所以也许这最终可以成为一个解决方案。
所以,简而言之,我可以做些什么来使用 Java 或您能想到的任何其他技术构建一个面向对象的模型,以正确地重新设计应用程序,而无需丢弃数据库或大幅修改它?
任何建议或研究领导将不胜感激。另外,如果我不够精确,请告诉我,我会努力改进我的问题。
【问题讨论】:
【参考方案1】:使用JPA 将您的数据库记录映射到实体中。
This wiki page 提供了很多高级用法示例:
一个实体的多个表:
@Entity
@Table(name="EMPLOYEE")
@SecondaryTable(name="EMP_DATA",
pkJoinColumns = @PrimaryKeyJoinColumn(name="EMP_ID", referencedColumnName="ID")
)
public class Employee
...
@Column(name="YEAR_OF_SERV", table="EMP_DATA")
private int yearsOfService;
@OneToOne
@JoinColumn(name="MGR_ID", table="EMP_DATA", referencedColumnName="ID")
private Employee manager;
...
单表中的多种实体(此示例是我的,wiki 上没有代码;希望我没有搞砸!):
@Inheritance
@DiscriminatorColumn(name="DISCRIMINATING_COLUMN")
@Table(name="SOME_TABLE")
public class Generic ...
// only maps records from SOME_TABLE where DISCRIMINATING_COLUMN=SOME_VALUE
@Entity
@DiscriminatorValue("SOME_VALUE")
public class firstSpecificType ...
// only maps records from SOME_TABLE where DISCRIMINATING_COLUMN=OTHER_VALUE
@Entity
@DiscriminatorValue("OTHER_VALUE")
public class secondSpecificType ...
来自过程调用的实体:
// This stored procedure returns a result set and has one input parameter.
@NamedStoredProcedureQuery(
name = "ReadAddressById",
resultClasses = Address.class,
procedureName = "READ_ADDRESS",
parameters =
@StoredProcedureParameter(mode=javax.persistence.ParameterMode.IN, name="P_ADDRESS_ID", type=Long.class)
)
@Entity
public class Address
...
还有很多其他的。
【讨论】:
投反对票的人,告诉我你投反对票的原因,我也许可以改进我的答案;) 感谢您的回答。我会做一些研究,看看 JPA 是否可以解决我的问题——从我所看到的来看,这正是我所寻找的。由于我的声誉,我不能投票给你,但非常感谢你的回答。 :) @Pikuni 没问题。我认为无论您的声誉如何,您都可以接受我的回答作为您问题的解决方案。花点时间确保它对你有用:) 我刚刚接受了您的回答,因为在我看来 JSP 将帮助我重新设计应用程序。我过去实际上使用过 JSP,但仅用于将多个表中的数据映射到一个对象中。我不知道你可以用它做这一切。现在你让我好奇了。我将调查所有这些 JSP 可能性。非常感谢您的帮助和建议。 :) @Pikuni 不客气,祝你好运! JPA 也不是 JSP,但你知道 ;)以上是关于如何在非关系数据模型上构建关系 Java 对象模型?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data MongoDB:如何实现“实体关系”?