Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA在我不';我不想这样_Java_Hibernate_Jpa_Spring Data Jpa_Persistence - Fatal编程技术网

Java Spring数据JPA在我不';我不想这样

Java Spring数据JPA在我不';我不想这样,java,hibernate,jpa,spring-data-jpa,persistence,Java,Hibernate,Jpa,Spring Data Jpa,Persistence,在这种情况下,我希望检索数据,但在返回数据之前,我希望在不保存/持久化的情况下对其进行更改 这是我的休息控制器: @RestController @RequestMapping("api/drawing-releases") @CrossOrigin("*") public class DrawingReleaseRestController { @Autowired private DrawingReleaseService service; @RequestMapp

在这种情况下,我希望检索数据,但在返回数据之前,我希望在不保存/持久化的情况下对其进行更改

这是我的休息控制器:

@RestController
@RequestMapping("api/drawing-releases")
@CrossOrigin("*")
public class DrawingReleaseRestController {
    @Autowired
    private DrawingReleaseService service;

    @RequestMapping(method = RequestMethod.GET, value = "/{id}")
    @JsonView(View.DrawingReleaseView.class)
    public ResponseEntity<DrawingRelease> getWithId(@PathVariable int id) throws EntityNotFoundException {
      return new ResponseEntity<>(service.getByID(id),HttpStatus.OK);
    }
}
然后在我添加的
getByID
方法中

em.close();
在我做任何改变之前。然而,我所做的任何更改仍在持续进行


是否有任何方法可以在服务层中进行未保存的更改?我想我可以创建一些POJO来镜像实体(但不是实体),然后复制数据并返回那些对象,但我似乎不需要这样做。

是的,您可以
从持久性上下文中分离实体:

是的,您可以
从持久性上下文中分离该实体:

您说您想获取一个实体,然后更改数据,然后返回它,而不必持久化该实体,但我认为您不应该为此使用该实体。既然数据不再代表数据库中的内容,为什么要更改数据以及用户将如何处理它。还将进行哪些其他更改,或者哪些其他假设(这是一个数据库对象)将无效

如果您使用数据库对象来派生不同的对象,那么为此您应该有不同的类。这很常见,称为数据传输对象(DTO),可以使用投影直接从spring数据jpa创建它们。Dto对象将实体作为构造函数,并从实体中填充它想要的任何属性。Dto不是持久对象,因此在保存时不会出现任何问题


更清晰、更易理解的设计与一致。

您说您希望获取一个实体,然后更改数据,然后返回数据,而不保留实体,但我认为您不应该使用实体来实现此目的。既然数据不再代表数据库中的内容,为什么要更改数据以及用户将如何处理它。还将进行哪些其他更改,或者哪些其他假设(这是一个数据库对象)将无效

如果您使用数据库对象来派生不同的对象,那么为此您应该有不同的类。这很常见,称为数据传输对象(DTO),可以使用投影直接从spring数据jpa创建它们。Dto对象将实体作为构造函数,并从实体中填充它想要的任何属性。Dto不是持久对象,因此在保存时不会出现任何问题


更加清晰易懂的设计,与。

I
detach
ed了顶层对象,但仍然保留了底层对象。如果我
detach
较低级别的对象,那么我会得到一个PersistentObjectException:传递给persist的分离实体。对此有什么想法吗?如果我调用任何存储库,即使该存储库与分离的实体无关,看起来也会出现分离实体异常。这是意料之中的事吗?有什么办法可以解决吗?spring data jpa为每个存储库使用单独的实体管理器,它自己管理连接,因此尝试使用jpa和spring data jpa变得复杂将是一个令人沮丧的练习。您应该决定是使用JPA还是spring data JPA,并将您的想法集中在其中一个方面。@K.Nicholas我没有真正了解您。怎样才能把注意力集中在其中的一个方面呢?我想你指的是父母和孩子吧?还是继承?不清楚您的问题是什么,因为您假设我们知道您的代码。简而言之,spring数据jpa不是jpa。它是jpa之上的一个抽象层。我是说,在尝试错误地使用spring数据jpa之前,您需要首先了解这一点。其次,我认为更重要的是,请参见下面的答案。我分离了顶层对象,但它仍然保留了底层对象。如果我
detach
较低级别的对象,那么我会得到一个PersistentObjectException:传递给persist的分离实体。对此有什么想法吗?如果我调用任何存储库,即使该存储库与分离的实体无关,看起来也会出现分离实体异常。这是意料之中的事吗?有什么办法可以解决吗?spring data jpa为每个存储库使用单独的实体管理器,它自己管理连接,因此尝试使用jpa和spring data jpa变得复杂将是一个令人沮丧的练习。您应该决定是使用JPA还是spring data JPA,并将您的想法集中在其中一个方面。@K.Nicholas我没有真正了解您。怎样才能把注意力集中在其中的一个方面呢?我想你指的是父母和孩子吧?还是继承?不清楚您的问题是什么,因为您假设我们知道您的代码。简而言之,spring数据jpa不是jpa。它是jpa之上的一个抽象层。我是说,在尝试错误地使用spring数据jpa之前,您需要首先了解这一点。第二,我认为更重要的是,请看下面的答案。也许我应该对此进行更多的研究。至于我为什么要这样做,我有一张可以有零件清单的图纸。任何图形都可以用于另一个图形的明细栏。图形本身可以包含零件1、2和3。如果该图纸是另一个零件列表的一部分,比如第12行,那么我希望它显示为12、12-1、12-2和12-3。在另一个图形上,它可能在第15行的零件列表上,因此15-1、15-2等。我仍然希望它作为项目1、2和3保存在数据库中,但根据上下文显示为其他内容。对,没错。将问题域与持久性域分开。您不希望修改零件中的信息,因为图形使用信息的方式不同,尤其是因为每个图形使用信息的方式都不同。查看一些设计模式
@Autowired
private EntityManager em;
em.close();