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

JPA:我看不到仅仅添加的实体

子车轶
2023-03-14

我使用JPA Hibernate Spring进行简单的工作。我写了下一个模块:

服务:

@Autowired
private VolMng volMng;

@Service
public class Dist {

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void gen() {
        MeterLog mLog = em.find(MeterLog.class, 3625190);
        Lst volTp = lstMng.findByCD("Fact Vol");
        Vol vol = new Vol((MeterLog) mLog, volTp, 7777.77d);
        volMng.add(vol);
        //point-1:
        for (Vol a : mLog.getVol()) {
            System.out.println("found="+a.getId()+" vol="+a.getVol1());
        }
...
...

服务:

@Service
public class VolMngImpl implements VolMng {

    @Autowired
    private VolDAO vDao;

    public void add(Vol vol) {
        vDao.add(vol);
    }

}

道:

@Repository
public class VolDAOImpl implements VolDAO {

    @PersistenceContext
    private EntityManager em;

    public void add(Vol vol) {
        em.persist(vol);
    }

}

我正在尝试向子实体卷添加一些记录。

但是在沃姆格之后。在点1添加(vol)我没有看到任何添加的记录(子实体)。为什么?

upd

当然我会在交易结束后看到这些记录,但为什么我不能在交易结束前看到这些记录呢???它们必须在内存缓存中。。。

upd2

我的Spring。xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd">

    <!-- *******************************
         ***** CACHE CONFIGURATION ***** 
         ******************************* -->                
    <cache:annotation-driven  cache-manager="cacheManager" />

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcache"/>
    </bean>
    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml"/>
        <property name="shared" value="true"/>
    </bean>    

    <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
          <property name="URL" value="jdbc:oracle:thin:@192.168.1.1:1521:DEV" /> 
          <property name="user" value="ora"/> 
          <property name="password" value="ora"/> 
          <property name="connectionCachingEnabled" value="true"/> 
    </bean>

    <bean
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        id="entityManagerFactory">
        <property name="dataSource" ref="dataSource" />
    </bean>

     <context:component-scan base-package="com.ric.bill" />
     <context:component-scan base-package="com.ric.bill.dao.impl" />
     <context:component-scan base-package="com.ric.bill.mm.impl" />


    <bean class="org.springframework.orm.jpa.JpaTransactionManager"
        id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

 <tx:annotation-driven mode="proxy" transaction-manager="transactionManager"/>



    <context:spring-configured />
    <context:annotation-config />


</beans>

共有3个答案

邬良才
2023-03-14

为了回答实际问题——为什么你看不到新添加的实体...

运行select语句并将结果放入java对象中:

MeterLog mLog=em.find(MeterLog.class,3625190)

查找最终创建选择语句,结果集通过Hibernate根据用于定义映射的jpa注释转换为MeterLog对象。从这一点上你的代码不会改变这个对象。使用以下代码创建一个新实体:

volMng.add(vol);

它直接将新实体保存在数据库中。但是,这是在select已返回您要求的数据之后。您不需要做任何更改或刷新已获取的结果集。底层数据存储(oracle、mysql等)不记得您已经查询过它并且保存了它的数据副本,因此它无法提醒您底层数据已经更改。

正如您在回答中提到的,您可以将新实体直接添加到对象的集合中:

mLog.getVol().add(vol);

在某些情况下,这将在事务成功完成时将新实体持久化到数据库中,但也允许您在循环收集时查看实体,从而观察到。然而,在这里这样做违反了德米特定律——创建给定MeterLog时,Vol应负责将其自身添加到卷集合中。

薛祯
2023-03-14

要解决此问题,我必须将子实体添加到父实体,如下所示:

    MeterLog mLog = em.find(MeterLog.class, 3625190);
    Lst volTp = lstMng.findByCD("Fact Vol");
    Vol vol = new Vol((MeterLog) mLog, volTp, 7777.77d);
    mLog.getVol().add(vol);
    //point-1:
    for (Vol a : mLog.getVol()) {
        System.out.println("found="+a.getId()+" vol="+a.getVol1());
    }
海新霁
2023-03-14

集合不会在会话中自动更新。一旦你重新加载所有内容,它就会出现,但是你必须手动将它添加到拥有对象的子集合中,以防你在当前会话中需要它。

 类似资料:
  • 我有一个用户名数组(例如,)要添加到图中的“user”标签下。 现在我首先要检查用户名是否已经存在(),然后仅在“user”标签下添加username属性不匹配的内容。 此外,这可以在单个gremlin查询或groovy脚本中完成吗? 我正在使用titan graph数据库、tinkerpop3和gremlin REST服务器。

  • 我可能需要一些帮助,因为我被这些文件弄糊涂了: 我有一个JPA母公司: 和孩子: 如果我只是增加联系人,我希望JPA能够建立这种关系。 e、 g: 现在发生的是: 触点插入DB(良好) 使用providerX。联系人中的id。提供者列(良好) provider\u contact表中未显示任何关系条目 我知道我可以将联系人设置为提供者的属性<代码>providerX。联系人。添加(c)。。。回购。

  • 问题内容: 我只想在文件末尾添加换行符,以防止在文件末尾出现多个换行符。 我希望使用sed。这是我当前代码遇到的问题: 当我在文件上运行代码时; 如果没有,它将添加换行符,如果存在则将其删除…这使我感到困惑。 问题答案: 由于它会删除换行符(如果不存在),因此您可以简单地使用: 添加换行符并删除所有内容,然后添加换行符。不是优雅的方式,但肯定可以工作:)

  • 问题内容: 我正在使用构建Web POST参数的方法,但是有一些值仅在它们不存在的情况下才想添加。 效果很好,但是如果我将变量设为可选,如何防止将其添加到参数中?像这样的东西(伪代码): 我希望这已经足够清楚了,有人知道如何解决吗? 问题答案: 创建初始字母后,您必须单独添加密钥: Python没有语法将键定义为条件键;如果您已经按顺序拥有所有内容,则可以使用dict理解: 但这不是很可读。 另一

  • 我对spring rest api有点陌生。我有两个具有单向多对一关系的实体。 假设我在城市表中已经有一些城市。当我想使用http post方法添加城市id为2的新用户时,我必须执行以下操作: 如您所见,我必须首先将城市ID分组到城市实体中。没有分组,我怎么做?这样地:

  • 我遵循了以下关于如何为单个产品将ajax添加到购物车的指南:https://aceplugins.com/ajax-add-to-cart-button-on-the-product-page-woocommerce/ 我在我的孩子主题function.php文件中有PHP,它应该工作。 我的问题是,我只想使用时,一个简单的产品,只有这样,它是可用于其他产品类型。 我尝试将其添加到函数中,如下所示