数据库中持久化和现有JPA实体的正确方法

数据库中持久化和现有JPA实体的正确方法,jpa,persist,Jpa,Persist,在我正在开发的一个应用程序中,我发现被修改的JPA对象没有预先加载,我的意思是 而不是这样做: getEntityManager().find(Enterprise.class, idEnterprise); //Some modifying operations 他们确实喜欢这样(而且很管用!): 最后一个解决方案不会从数据库加载对象,它会正确修改对象 这怎么可能 这是个好习惯吗?至少可以避免从数据库加载的查询,对吗 谢谢,视情况而定。如果您是从控制器类(或任何应用程序代码)编写代码,您不应

在我正在开发的一个应用程序中,我发现被修改的JPA对象没有预先加载,我的意思是

而不是这样做:

getEntityManager().find(Enterprise.class, idEnterprise);
//Some modifying operations
他们确实喜欢这样(而且很管用!):

最后一个解决方案不会从数据库加载对象,它会正确修改对象

  • 这怎么可能
  • 这是个好习惯吗?至少可以避免从数据库加载的查询,对吗

  • 谢谢,视情况而定。如果您是从控制器类(或任何应用程序代码)编写代码,您不应该担心jpa的东西,因此第二种方法是不好的和冗余的

    相反,如果您使用的是基础结构代码,那么您可以手动持久化实体以实现某些性能优化,或者仅仅因为您希望即使事务失败,数据也能持久化


    我强烈怀疑第二段代码是某人从头开始创建实体,但在同一方法中混合了应用程序、域和基础结构代码:这是一种极其邪恶的做法。(非常邪恶,达斯邪恶之父,永远不要那样做)

    -为什么第二种方法是不好的和多余的?-第二种方法是避免一个查询,对吗?事实上,根据这个线程(),当您想要保存一个实体并且它有一些其他实体(外键)时,不需要从数据库中加载它们,除非您想要修改它们,然后您可以使用“em.getReference(Account.class,accountId)”,正如我所说的,这是一种不好的做法(因为您在同一个方法中混合了不同的关注点)但是,如果需要优化已建立的应用程序,并将其限制在数据库逻辑中,则可以这样做。
    Enterprise obj = new Enterprise (IdEnterprise);
    //Some modifying operations
    getEntityManager().persist(obj);