【问题标题】:using flush and clear after each persist or merge在每次持久化或合并后使用刷新和清除
【发布时间】:2013-12-26 23:57:03
【问题描述】:

好吧,我在 postgreSQL 中有一个触发器函数,每次插入新行时都会生成一个数字。但是 JPA/Hibernate 在“entityManager.persist(bean)”之后不显示这个生成的数字。所以我做了以下强制它:

@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
    public AbstractBean save(AbstractBean bean) {
        try {
            logger.info("Salvando Bean " + bean.getClass().getName());
            entityManager.persist(bean);
            entityManager.flush();
            entityManager.clear();
            return bean;
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("Ocorreu um erro ao tentar salvar. MSG ORIGINAL: "
                    + e.getMessage());
            throw new DAOException("Ocorreu um erro ao tentar salvar");
        }
    }

我在persist方法之后插入了“flush and clear”,一切都很好。但我最大的疑问是:所有应用程序都调用我的方法“save”来保存任何 JavaBean,所以如果我在所有持久化或合并中进行刷新和清除没有问题?这是更好的选择?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    在我看来,为所有saves 设置flushclear 并不是最佳选择——在这种情况下缓存的目的是什么。

    我会实施

    em.getEntityManagerFactory().getCache().evict(theSpecialClass, thePrimaryKey);
    

    在哪里bean instanceOf theSpecialClass

    【讨论】:

    • evict 是更好的解决方案,但我使用的是 JPA (entityManager),我没有这个工具,只是 clear()。
    • em是entityManager,反正我的重点是测试你保存的bean是不是instanceOf这个特殊的bean
    • 我的 entityManager (em) 对象没有 getEntityManagerFactory() 方法。
    • 我还建议您从 Java 5 升级。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多