Jakarta ee 如何在JavaEE中建模?

Jakarta ee 如何在JavaEE中建模?,jakarta-ee,java-ee-6,modeling,data-persistence,Jakarta Ee,Java Ee 6,Modeling,Data Persistence,比方说,我已经决定为我的企业应用程序使用JavaEE堆栈 现在,对于领域建模(或者:设计MVC的M),我可以安全地假设和使用哪些API,我应该远离哪些API。。。比如说,通过抽象层 比如说, 我是否应该继续用对Hibernate/JPAAPI的调用来填充我的模型?或者,我应该建立一个抽象。。。我自己的一个持久性层,以避免针对这两个特定的持久性API进行硬编码为什么我要问这个问题:几年前,有一个Kodo API被Hibernate取代。如果一个人设计了一个持久层,并根据该层对模型的其余部分进行编码

比方说,我已经决定为我的企业应用程序使用JavaEE堆栈

现在,对于领域建模(或者:设计MVC的M),我可以安全地假设和使用哪些API,我应该远离哪些API。。。比如说,通过抽象层

比如说,

  • 我是否应该继续用对Hibernate/JPAAPI的调用来填充我的模型?或者,我应该建立一个抽象。。。我自己的一个持久性层,以避免针对这两个特定的持久性API进行硬编码为什么我要问这个问题:几年前,有一个Kodo API被Hibernate取代。如果一个人设计了一个持久层,并根据该层对模型的其余部分进行编码(而不是在模型中乱调用特定的供应商API),那么他就可以(相对地)轻松地从Kodo切换到Hibernate再切换到xyz

  • 是否建议在域模型中积极使用持久性供应商提供的*QL?我不知道由于大量使用类似HQL的语言而产生的任何实际问题(如性能、可伸缩性、可移植性等)为什么我要问这个问题:我希望尽可能避免编写自定义代码,因为这可以通过比SQL更可移植的查询语言来实现


  • 对不起,我对这个地区完全是新手。在哪里可以找到有关此主题的更多信息?

    您的域模型及其持久化层在理论上应该是分开的-没有必要让名为
    实体的类知道它是否持久化以及如何持久化,因此,您可以使用Hibernate之类的工具来创建持久层,而不会污染域模型类本身。您不需要“针对该层对[…]模型进行编码”——您需要对模型进行编码,然后将其映射到具有某种ORM层的持久存储,其中域模型不依赖于ORM层。显然,持久层将取决于域模型,但这很好


    出于您提出的原因,我个人不愿在(N)Hibernate中使用太多HQL,但有时这是不可避免的。你已经知道并强调了其中的主要问题,因此你不太可能过度使用它。

    以下是我认为的传统观点:

    • 项目中的实体构成域模型。它们应该是可重用的,并且不与持久性技术紧密耦合(稍后我将讨论紧耦合和松耦合)
    • 业务层使用域模型,但也公开服务和其他内容
    • 数据访问层负责将域模型(实体)持久化到持久化存储中
    实体不应直接调用数据访问层。但业务层将以某种方式加载和持久化域模型的实体

    如果将其映射到Java EE技术,通常会得到如下结果:

    • 实体-->带有Hibernate/JPA注释的POJO。注意,注释并不意味着与JPA/Hibernate紧密耦合,同样的POJO可以在没有Hibernate的地方使用
    • 业务层-->会话EJB或Spring
    • 数据访问层-->JPA/Hibernate

    这是一个粗略的草图,有很多可能的变体。您可以跳过会话EJB,以另一种方式实现业务层。您还可以决定让业务层直接调用JPA/Hibernate会话/EntityManager,在这种情况下,JPA/Hibernate实际上是DAL,或者您可能希望将会话/EntityManager的访问封装到所谓的数据访问对象(DAO)中


    关于HQL,请尽量坚持可移植性,如果使用本机SQL,请遵循SQL-92约定。如果事情变得复杂,可以介绍DAO。这样,您就知道只有DAO中存在HQL查询。您还可以首先在DAO中“按程序”实现查询逻辑,如果您有性能问题,请使用更复杂的HQL查询重新实现它

    编辑

    关于您在评论中提出的问题:

    业务层依赖于数据层。如果您希望业务层不依赖于Hibernate/JPA,那么您的数据层需要将Hibernate/JPA抽象出来。如果在数据层中使用DAO,情况就是这样。DAO将是“Hibernate上的薄手写持久层”(用你的话说)。我将为您的案例中的所有实体介绍DAO


    你要问的是一个非常普通的设计问题。我不能给出一个明确的答案,也不可能在一个答案中总结所有的变体,因为这取决于具体情况。例如,到目前为止,我们还没有谈到事务的问题,通常从业务层开始,但数据层必须意识到这一点。这通常取决于所使用的技术和您的需求

    尽管如此,这里还是列出了您可能感兴趣的资源:书籍、书籍、书籍,更具体地说,还有模式(如果是针对web应用程序的),还有可能

    编辑2

    好的,再多说几句关于交易的话:

    交易应在业务层进行概念性管理;在一个工作单元中需要做什么才能保持一致的定义实际上取决于应用程序的逻辑本身

    使用EJB3,可以使用注释和应用程序声明事务。服务器为您管理这些。有关更多信息,请参阅我的。使用Spring,您还可以声明性地标记事务,但我不知道细节。否则,您需要自己启动/停止事务。无论您使用JDBC事务还是JTA事务,这都会略有不同

    事务还与Hibernate/JPA中的延迟加载有关。延迟加载的实体实际上只能在存在当前事务的情况下加载。如果交易是定期的