当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA在我不想更新实体时更新实体

壤驷安和
2023-03-14

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

这是我的Rest控制器:

@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);
    }
}

以下是服务实现:

@Service
public class DrawingReleaseServiceImpl extends DrawingFunctions implements DrawingReleaseService {
    /**
     * Logging Manager
     */
    private static final Logger LOGGER=LogManager.getLogger();

    @Autowired
    private DrawingReleaseRepository repository;

    @Override
    public DrawingRelease getByID(int id) throws EntityNotFoundException {
        Optional<DrawingRelease> opt = repository.findById(id);
        ...
        // manipulate the data here
        ...
        return opt.get();
    }
}

最初我在服务上有@Transactional注释。通过删除它而不在getByID方法中使用它,我首先想到的是会话将使用存储库打开和关闭,如这里的答案所示。

这不起作用,我在评论中看到“会话将持续整个HTTP请求处理过程。”所以,在我添加的服务中

@Autowired
private EntityManager em;

然后在我添加的getByID方法中

em.close();

在我做任何改变之前。然而,我所做的任何更改仍在持续进行。

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

共有2个答案

郎聪
2023-03-14

是的,您可以将实体从持久性上下文中分离出来:https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#detach-java.lang.Object-

蓝昊然
2023-03-14

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

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

设计更加清晰易懂,符合SOLID原则和代码结构。

 类似资料:
  • 我有一个批处理过程,它正在为一组实体重新计算数据。通过Hibernate从DB获取实体列表: 当流程运行时,某些实体似乎正在分离,导致两种症状: 当尝试获取惰性数据时,我得到一个异常: 在我的第一次尝试中,我试图通过调用inside

  • 主要内容:JPA实体更新示例JPA允许我们通过更新实体来更改数据库中的记录。 JPA实体更新示例 在这里,我们将演示如何根据主键更新学生的年龄。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码如下 - 在包下

  • 我有这样的Jpa存储库:

  • 在Symfony 2(最新版本)下,我试图更新我的实体: 我得到了这个错误消息到我的终端: [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException] 无法识别的选项“security.firewalls.access\u control”下的“0、1、2、3” 我是Symfony的新手,我不知道在哪里

  • 我不敢相信其他人没有想到这一点,但我无法找到解决办法。 假设我有两种实体类型,A和B具有一对多的关系。A有一个B的集合。 对于Bs,A的表单有一个集合类型(CollectionType),对于B有一个自定义的条目类型(entry\u type),允许添加(allow\u add)和删除(allow\u delete)设置为真(true)。创建/填充/呈现表单时,Bs字段由其在集合中的索引标识。当表

  • 我正在尝试更新我的用户实体,我想到了一个错误:错误:NULL值违反了“id”列的Not NULL约束详细信息:失败的行包含(null,1,1) 这个问题肯定源于我在用户和配置文件之间的关系,即n-n