JPA最佳实践?

8
我正在开发一个简单的多层应用程序,利用JPA / EclipseLink作为持久性层。在我的当前设计中,我有两组对象,POJO和实体对象,我使用POJO进行一般编程任务,而实体类用于DB读/写和表映射。
现在是否需要具有POJO=>实体映射(存在问题),然后再进行第二个实体=>DB表映射(JPA注释)?我发现只使用Entity类作为我的主要java对象并在必要时持久化它们更容易,毕竟Entity类本质上是带有几个JPA注释的POJO。
此外,在确实需要保持分离的情况下,执行POJO=>实体映射的最佳位置是什么,目前我在CRUD方法中执行此操作,例如:
public void addCustomerPOJO(Customer customerPOJO){
   //Cteat EntityManager and start a Transaction

   //Create Entity class and populate it with values 
   //from the passed-in regular (non entity) Customer class

  //Persiste and close
}

有没有更好的或更常见的方法来做这个?

8个回答

3

使用您的实体作为域对象没有任何问题。但您必须注意使用已分离等实体,但这可以管理。

我不会强制使每个实体映射到另一个bean(或POJO)以创造额外工作量。有时需要将许多实体(或来自实体的值)封装到bean中,但仅在有充分理由时才这样做。


2
也许混淆是由于实体只是一个带有映射信息的POJO(在代码中作为注释或在单独的配置文件中)。只要您愿意,它就像POJO一样工作(您可以创建和修改对象;只要您不使用Session保存它们,它们就不会被写入数据库)。
有时,您可能需要将数据存储在不是实体的bean中(主要是因为该bean由另一个框架管理,您不想混合*1),那么您只需将该数据从您的bean复制到您的实体/POJO即可(通过特定的构造函数,通过调用大量的set...()等)。
*1我在这里考虑的是JSF。

2

我认为没有理由使用两个平行的对象层次结构。 我会使用实体并摒弃你所谓的POJO。 没有必要进行映射。 在我看来,这是浪费CPU周期而没有任何好处。


2

我目前正在开发一个使用JPA作为后端的三层Java EE应用程序。我用单个Java类来表示数据库中的每个表格(实体类),并且我使用相同的类来执行所有操作,包括业务层和数据库层。这也是有道理的。 因为在所有三个层中,您可以独立地创建相同实体类的实例。

PS- @Hay: 即使当我开始学习JPA时,我也像你一样使用了两个不同集合的相同类进行操作 :) 我猜这种做法是由于EJB 2.1没有任何注释而产生的。因此需要两个不同的类集合,其中一个必须完全专门用于DAO操作的实体类。 随着JPA的发展,引入了注释,这使我们的生活变得更加轻松。习惯难改啊;)


1

注解确实有其缺点,尤其是在多层Java EE应用程序中。

在下面的示例中,您有一个简单的POJO对象(域对象),您希望

  1. Java REST客户端使用它
  2. REST服务器接受此对象作为参数,并
  3. 将此对象持久化到数据库。

我认为这是一个常见的用例。

由于有那么多的注解,使用此对象的客户端需要所有jar依赖项。我想注解可以移动到XML文件中,但那么注解的优势就会丧失。

是否有其他创造性的解决方案?

@Data
@Entity
@XmlRootElement(name="sport")
@Table(name = "db_sport")
@NamedQueries({
   @NamedQuery(name = "Sport.findAll", query = "SELECT d FROM Sport d")})
public class Sport implements Serializable {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Basic(optional = false)
   @Column(name = "sportId")
   int sportId;
}

1
你不需要所有的依赖项,因为注解类在运行时不必可用:https://dev59.com/UHA65IYBdhLWcg3w6DJO。 - Sami Korhonen

0

两个链接都失效了。 - Ortomala Lokni
@OrtomalaLokni 你好,最近怎么样? :) 我使用Wayback Machine的截图更新了链接。 - Paul Vargas

0

你可能需要使用另一组类来防止涟漪效应。这通常是具有多个依赖项的 Web 服务的情况。总体而言,数据映射增加了程序的复杂性,除非有有效的理由,否则应该避免使用。


0

我的 $0.20

除非你能记住代码中关系的标记方式,以及何时由Hibernate填充它们,以及何时/在何处访问它们,否则我建议你采用DTO方法。

然而,如果你正在学习Hibernate或者将其用于小型项目,那么从控制器层返回实体(或它们的集合)可能更容易。

但我相信你做得越多,你就会发现需要转向DTO甚至JsonView。如果你不是构建UI的人,你会更早意识到这一点。

说到DTO,我的最爱是ModelMapper。你可以在控制器层进行转换(无论是简单还是复杂),这样你就知道在DTO内部返回了什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接