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

jpa刷新或在持久化之前查找

翟学文
2023-03-14

在Spring声明性事务管理中,当您试图持久化数据库中已经存在的某个实体时,您只能在Spring事务提交期间获得DataIntegrityViolationException。因此,此方法不起作用,此处不会捕获大括号中的异常:

@Repository
public class UserDAOImpl implements UserDAO {

    @PersistenceContext
    EntityManager em;

    @Override
        public void createUserRole(String role) throws RoleAlreadyExistsException {
            try {
                UserRole userRole = new UserRole(role);
                em.persist(userRole);
            } catch (Exception e) {
                throw new RoleAlreadyExistsException();
            }
        }
}

仅在结束时:

@Service("userService")
public class UserService 
    @Transactional
        public void createUserRole(String role) throws RoleAlreadyExistsException {
            userDao.createUserRole(role);
        }
}

我发现了几个解决方法:

  • 不使用@事务
  • 使用冲洗
  • 调用服务时捕获异常
  • 在持久化之前查找

现在我在考虑em.flush和em.find(在坚持之前)。哪种方法更好用(刷新丢失性能,查找数据库冗余请求)?如果我在这里弄错了,请指出我。

共有1个答案

南宫松
2023-03-14

有时,flush可能有助于在正在进行的事务之间持久化数据

因此,当您调用em.flush()时,将在数据库中执行插入/更新/删除关联实体的查询。此时将知道任何约束失败(列宽、数据类型、外键)。

就你的情况而言,我将使用同花顺。

 类似资料:
  • 我使用JPA(Eclipse Link 2.5)进行持久性。我的Web应用程序包含AJAX页面更新。保存帖子时,发布的内容会在不刷新浏览器的情况下显示。该帖子具有使用OneTo多关系与之关联的标签。这些标签应该在保存后也会显示出来。但是,由于启用了缓存,我无法获取标签。 这是我的代码: 我怎样才能让事情运转起来?如何刷新一个实体及其所有关联的实体?谢了。

  • 主要内容:JPA级联持久化示例,输出结果级联持久化用于指定如果实体持久化,则其所有关联的子实体也将被持久化。 以下语法用于执行级联持久性操作 - JPA级联持久化示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步:

  • 当使用修改查询时,我有一个问题,EntityManager在查询执行后包含过时的实体。 假设我们在DB中有电子邮件[ID=1,active=true,expire=2015/01/01]。 执行后:

  • 谢谢 ----更新----

  • 和RDD相似,DStreams也允许开发者持久化流数据到内存中。在DStream上使用persist()方法可以自动地持久化DStream中的RDD到内存中。如果DStream中的数据需要计算多次,这是非常有用的。像reduceByWindow和reduceByKeyAndWindow这种窗口操作、updateStateByKey这种基于状态的操作,持久化是默认的,不需要开发者调用persist(

  • 目标 能够运行集合,而无需在运行集合之前逐个完成每个调用的授权过程。 我所尝试/注意到的 > 在Postman中使用OAuth2授权助手时,我没有发现保存返回的刷新令牌的方法,因此在访问令牌到期时使用它来获取新的令牌。(我建议将此功能放在Postman Github问题中的助手中。) 我尝试在集合开始时创建几个步骤来复制助手,但无法通过需要用户交互来批准/拒绝的步骤(这是有道理的,因为否则会带来安