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

4 浏览
0 Comments

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

我使用JPA + Hibernate + Spring来进行简单的工作。

我编写了以下模块:

Service:

@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:

@Service
public class VolMngImpl implements VolMng {
    @Autowired
    private VolDAO vDao;
    public void add(Vol vol) {
        vDao.add(vol);
    }
}

DAO:

@Repository
public class VolDAOImpl implements VolDAO {
    @PersistenceContext
    private EntityManager em;
    public void add(Vol vol) {
        em.persist(vol);
    }
}

我试图向子实体Vol中添加一些记录。

但是,在point-1处的volMng.add(vol)之后,我看不到任何添加的记录(子实体)。

为什么?

更新

当然,我在事务结束后看到这些记录,但为什么我不能在事务之前看到它们呢?它们必须在内存缓存中...

更新2

我的spring.xml



                    
    
    
        
    
    
        
        
        
     
           
           
           
           
    
    
        
    
     
     
     
    
        
    
 
    
    

0
0 Comments

问题的原因是在执行查询语句后,代码没有改变或刷新已获取的结果集。因此,即使数据库中的数据发生了更改,代码仍然无法看到新添加的实体。

解决方法是直接将新实体添加到对象的集合中,这样在循环遍历集合时就可以看到新实体。但是,这样做违反了Demeter法则,因为应该由Vol对象在创建时负责将自己添加到给定MeterLog的集合中。

因此,为了解决这个问题,可以在添加新实体后手动刷新结果集,或者确保对象的集合在添加新实体时自动更新。这样就可以及时看到新添加的实体了。

0
0 Comments

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

在使用JPA过程中,有时候会遇到无法看到刚刚添加的实体的情况。下面是解决这个问题的原因和方法。

原因:

这个问题的原因可能是因为实体的添加操作尚未被JPA刷新到数据库中,导致在查询时无法看到这些刚刚添加的实体。

解决方法:

为了解决这个问题,我们可以采取以下方法:

1. 使用EntityManager的flush()方法手动刷新实体操作到数据库中。示例代码如下:

    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);
    em.flush(); // 手动刷新实体操作到数据库
    //point-1:
    for (Vol a : mLog.getVol()) {
        System.out.println("found="+a.getId()+" vol="+a.getVol1());
    }

通过调用EntityManager的flush()方法,可以将实体操作立即刷新到数据库中,这样就能够确保在查询时可以看到刚刚添加的实体。

通过手动刷新实体操作到数据库,我们可以解决JPA在查询时无法看到刚刚添加的实体的问题。使用EntityManager的flush()方法可以确保实体操作被立即刷新到数据库,从而保证我们能够看到最新的实体数据。

0
0 Comments

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

在使用JPA时,有时我们会遇到无法看到刚添加的实体的情况。这是由于集合在会话中不会自动更新导致的。只有在重新加载所有内容后,它才会出现。但是,如果您需要在当前会话中使用它,您必须手动将其添加到拥有对象的子集合中。

这个问题的原因是JPA不会自动更新会话中的集合。换句话说,当您在数据库中添加新的实体后,会话中的集合不会立即反映出这些更改。因此,您需要手动将新实体添加到拥有对象的子集合中,以使其在当前会话中可见。

解决这个问题的方法是在添加新实体后,手动将其添加到拥有对象的子集合中。这样,当您需要在当前会话中访问这个实体时,它将立即可见。以下是一个示例代码,演示了如何解决这个问题:

// 添加新实体
Entity newEntity = new Entity();
entityManager.persist(newEntity);
// 手动将新实体添加到拥有对象的子集合中
OwningEntity owningEntity = entityManager.find(OwningEntity.class, owningEntityId);
owningEntity.getChildren().add(newEntity);

在上面的示例代码中,我们首先使用JPA的persist()方法将新实体添加到数据库中。然后,我们使用find()方法找到拥有对象,并通过调用getChildren()方法获取其子集合。最后,我们将新实体添加到子集合中。

通过这种方式,我们可以确保在当前会话中能够立即看到刚添加的实体。这种手动添加的方法可以确保集合在会话中得到正确更新,从而解决了无法看到刚添加的实体的问题。

总结起来,JPA在会话中的集合不会自动更新,这可能导致无法立即看到刚添加的实体。为了解决这个问题,我们可以手动将新实体添加到拥有对象的子集合中,以确保在当前会话中能够立即看到它。

0