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

做Jpa

曹建明
2023-03-14

我有一个oracle视图,我在其中查询我的数据库。

create or replace view my_view as
Select cc.CCID ccid
       sm.SMCODE smcode,
       NVL(sm.smname, cc.ccname) sname
  From CC cc
 Inner Join SM sm
    On cc.id = sm.id;

我使用< code>jpa 2.1和< code>hibernate 4.3.7将视图映射到实体。我的实体类如下所示:

public class CCRequest implements Serializable {

    private static final long serialVersionUID = 1L;

    private String ccId;

    private String smCode;

    private String sName;
}

我的映射 xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 version="2.1">
    <entity class="CCRequest" name="CCRequest001">
        <table name="my_view"/>
        <attributes>
            <id name="ccId">
                <column name="ccid"/>
            </id>
            <basic name="smCode">
                <column name="smcode"/>
            </basic>
            <basic name="sName">
                <column name="sname"/>
            </basic>
        </attributes>
    </entity>
</entity-mappings> 

因此,我使用jpa正确查询我的实体,它返回我的所有记录。问题是,当我异步更改数据库中的数据时,令人震惊的是,我的jpa查询返回以前的记录。我做错了什么吗?

共有3个答案

鲜于河
2023-03-14

我面临的问题是,在4之前的Spring,我们有JpaTemplate来处理jpa实体,我以编程方式将EntityManager从EntityManagerFactory的实例传递到JpaTemplate的实例,没有问题。 JpaTemplate本身可以执行任何刷新EntityManager和清除缓存的事情。当我迁移到Spring4时,我遇到JpaTemplate已被删除,因此我必须直接使用EntityManager。 我以编程方式从EntityManagerFactory的实例中获取EntityManager的实例。 我有一个EntityManagerProvider类,它从EntityManagerFactory的实例创建EntityManager的实例。

public class EntityManagerProvider {

    public static EntityManager createEntityManager(EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.createEntityManager();
    }
}

我得到这样的entityManager实例:

<bean id="entityManager" class="com.tosan.novin.sipa.bo.da.jpa.EntityManagerFactoryProvider" factory-method="createEntityManager">
        <constructor-arg index="0" ref="entityManagerFactory"/>
</bean>

但我明白,如果我想要EntityManager管理事务和刷新,唯一的方法就是使用@PersistenceContext,将EntityManager注入我的bean中。

@PersistenceContext
protected EntityManager em;

我对这种方式还有点困惑,但是我的问题用这种方法解决了。

江佐
2023-03-14

不那么令人震惊的是,JPA对更新您的数据库的其他进程没有先见之明,怎么可能呢?您是唯一知道这一点的人,因此必须使用

em.refresh(obj)

如果您知道数据已(可能)更改,则更新对象

庾才
2023-03-14

Hibernate缓存以前的结果,因此您应该使用< code > entitymanager . clear()来清理关联的缓存。它将强制再次执行查询。相关线索了解更多详情:

  • 何时使用EntityManager.clear ()?
  • 我应该经常打电话给EntityManager.clear()以避免内存泄漏吗?
  • Hibernate不会完全刷新实体孩子

有关Hibernate缓存的更多信息:

  • Hibernate中的一级和二级缓存是什么?
  • 如何禁用Hibernate缓存

另一种选择是使用entityManager。刷新(obj)以将数据库数据与会话数据同步。

 类似资料:
  • 问题内容: 我正在阅读一本有关html开发的书(我还比较陌生),尽管该书一个月前(2011年11月)才刚刚出版,但作者是一位经验丰富的编码人员,也许可以用于行动形式是老派? 因为我试图获得示例代码的要点,但是尽管进行了搜索,却找不到解释。 在Google,SO和www.w3schools.com上。 有人知道该动作对表格意味着什么吗? 问题答案: 动作通常指定提交表单的文件/页面(使用方法参数中所

  • 在OracleJava文档中提到 请查看以下代码: } 如果 现在如果

  • 合流模式注册表不使用Quarkus和微文件 以以下错误结束 我尝试构建一个Quarkus kafka消费者应用程序,它必须对kafka主题中可用的avro序列化程序消息进行反序列化 配置 也尝试如下 性能 也尝试了以下方法

  • 问题内容: 为什么我们需要特定于数据库的功能,例如mysql_real_escape_string()?addlashes()不能做什么? 暂时忽略了参数化查询的高级替代方案,是一个仅使用addlashes()的web应用仍然容易受到SQL注入的攻击,如果是,怎么办? 问题答案: 当处理多字节编码的字符串时,加号通常不够好。

  • 本文向大家介绍PHP 在做,包括了PHP 在做的使用技巧和注意事项,需要的朋友参考一下 示例 do-while 循环首先在每种情况下执行一次代码块,然后在指定条件为真的情况下循环遍历该代码块。 有关详细信息,请参见“循环”主题。

  • 如何验证 Email 地址是否有效 一般来说,你不能。有一些看起来合理的方法可以使用,但却没有办法检测地址 是否实际可以投递,如果没有实际尝试投递的话。 使用正则表达式: # Match basically blah@blah.blah if ( $addr =~ /^\S+\@\S+\.\S+$/ ) { print "Looks OK"; } 如果你干真活的话,可能希望看看 CPAN