JPA最佳做法?

时间:2011-08-16 23:41:58

标签: java jpa entity pojo

我正在开发一个利用JPA / EclipseLink作为持久层的小型多层应用程序。在我目前的设计中,我有两组对象,POJO和Entity对象,我使用POJO进行常规编程任务,而Entity类用于DB读/写和表映射​​。

现在有必要让POJO =>实体映射(有问题),然后是第二个Entity ==> DB表映射(JPA注释)?我发现使用Entity类作为我的主要java对象更容易,并且在所有Entity类本质上是POJO并带有几个JPA注释之后,在必要时将它们持久化。

同样在确实需要将事物分开的情况下,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 个答案:

答案 0 :(得分:3)

将您的实体用作域对象没有任何问题。你必须要知道使用已经分离的东西以及诸如此类的东西,但这可以被管理。

我不会通过强制每个实体映射到另一个bean(或POJO)来人为地为自己创建工作。有时需要将许多实体(或实体中的值)包装到bean中,但只有在有充分理由的情况下才能这样做。

答案 1 :(得分:2)

也许这种混淆是由于实体 只是一个带有映射信息的POJO(在代码中作为注释或在单独的配置文件中)。只要你想要的东西就可以作为POJO使用(你可以创建和修改对象;只要你不用会话保存它们就不会在DB中写入它们。)

有时您可能需要将数据放在不是实体的bean中(主要是因为该bean由另一个框架管理而您不想混合* 1),那么您只需复制(通过特定的构造函数,通过调用从bean到您的Entity / POJO的数据集...(),等等。

* 1我在这里考虑JSF。

答案 2 :(得分:2)

我认为没有理由像这样有两个并行对象层次结构。我有实体并放弃你所谓的POJO。无需映射。这是浪费CPU周期,没有任何好处,我可以看到。

答案 3 :(得分:2)

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

PS - @Hay:即使我开始学习JPA,我也会使用两组不同的类进行操作:)我想,这种做法出现了EJB 2.1的becoz,它没有任何注释。因此,基本上需要两组不同的类,其中一组必须完全专用于DAO操作的ENTITY CLASSES。 随着JPA的发展,注释被带入了画面,这让我们的生活更加轻松。老人的确很难干;)

答案 4 :(得分:1)

注释确实存在缺点,特别是在多层Java EE应用程序中。

在下面的示例中,您有一个您想要的简单POJO对象(Domain对象)

  1. 要使用的java REST客户端
  2. REST服务器接受此对象作为参数,
  3. 将此对象持久保存到数据库中。
  4. 我认为这是一个常见的用例。

    如此多的注释使用此对象的客户端需要所有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;
    }
    

答案 5 :(得分:0)

您可能需要使用另一组类来防止涟漪效应。具有多个依赖关系的Web服务通常就是这种情况。数据映射通常会增加程序的复杂性,应该在没有正当理由的情况下避免使用。

答案 6 :(得分:0)

请参阅Lee Chuk Munn JPA Best Practices 幻灯片。您可以在JPA Best Practices - Indo Java Podcast中找到它。

答案 7 :(得分:0)

我的0.20美元

  

除非你能记住代码中的关系是如何标记的   当它们被hibernate填充时以及何时/何时访问它们   在代码中我建议你采用DTO方法。

但是,如果你正在学习hibernate或者在小项目中使用它,你可能很容易从控制器层返回实体(或它们的集合)。

  

但我相信你做的越多,你就越需要   转到DTO甚至是JsonView。如果你不是那个人   建立用户界面然后你会更快意识到它。

说到DTO,我最喜欢的是ModelMapper。你可以在控制器层进行转换(简单和复杂,无论你喜欢什么)。通过这种方式,您将了解您在DTO内返回的内容。