2016-06-20 3 views
0

Я использую JPA + Hibernate + Spring для простой работы. я написал следующие модули:JPA: Я не вижу только добавленные объекты

Услуги:

@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); 
    } 

} 

DAO:

@Repository 
public class VolDAOImpl implements VolDAO { 

    @PersistenceContext 
    private EntityManager em; 

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

} 

Я пытаюсь добавить некоторые записи в дочернюю сущность Vol.

Но после volMng.add (vol) в точке-1 я не вижу никаких добавленных записей (дочерние сущности). Почему?

обн

Конечно, я вижу эти записи после завершения сделки, но почему я не могу сделать это раньше ??? Они должны находиться в кэш-памяти ...

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> 
+1

Какова конфигурация источника данных в вашей весне? Причиной может быть автоматическая фиксация транзакции. – LynxZh

+0

Я добавил его в строку upd2 – Lev

ответ

1

Коллекции не обновляются автоматически в сеансе. Он появится после перезагрузки всего, но вы должны вручную добавить его в дочернюю коллекцию объекта-владельца, если он вам нужен в текущем сеансе.

0

Чтобы решить эту проблему, я должен добавить детей сущности к родителю, как это:

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()); 
    } 
0

Чтобы ответить на актуальный вопрос - почему вы не можете увидеть вновь добавленный объект ...

Вы запускаете оператор выбора и поместить результаты в объект Java:

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

находка в конечном счете создает выберите выписку d результирующий набор преобразуется в объект MeterLog через спящий режим в соответствии с аннотациями jpa, которые вы использовали для определения отображения. С этого момента ваш код не изменяет этот объект. Вы создаете новый объект с этим кодом:

volMng.add(vol); 

который непосредственно сохраняет новый объект в базе данных. Но это после того, как select уже вернул данные, которые вы просили. Вы ничего не делаете для изменения или обновления набора результатов, который вы уже приобрели. В базовом хранилище данных (oracle, mysql, whatever) не помнят, что вы запросили его и хранят копию своих данных, поэтому он не может ничего сделать, чтобы предупредить вас о том, что базовые данные изменились.

Как вы упоминаете в своем ответе, вы можете добавить новый объект непосредственно к коллекции объекта:

mLog.getVol().add(vol); 

И это, при определенных обстоятельствах, сохраняется новый объект в базу данных, когда транзакция завершается успешно , но также позволяет вам видеть объект, когда вы просматриваете коллекцию, следовательно, ваше наблюдение. Вы нарушили закон Деметры, сделав это здесь, однако, это должно быть обязанностью Vol, чтобы добавить себя в сборник томов данного MeterLog, когда он создан.

Смежные вопросы