簡體   English   中英

Hibernate saveorupdateall沒有保存不更新

[英]Hibernate saveorupdateall not doing save not update

我有一個spring集成的hibernate應用程序。 我的應用程序選擇文件並根據數據庫檢查其條目。 為此,我正在使用Hibernate。

我想禁用數據庫中的某些行。 我正在使用條件檢索行。 編輯一個字段並使用saveorupdateall方法。 這根本不會改變我的數據庫行!

以下是代碼片段

  <bean id="dmsdbDetectionJob" class="com.polling.scheduler.job.DMSDBDetectionJob">

 </bean>
 <bean id="dmsdbDetectionJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="dmsdbDetectionJob" />
    <property name="targetMethod" value="deleteDBMaster" />
    <property name="concurrent" value="false" />
 </bean>
<bean id="simpleTriggerDB" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="dmsdbDetectionJobDetail" />
    <!-- <property name="cronExpression" value="1 * * * * ?" /> --> 
<!--    <property name="cronExpression" value="0 0/1 * * * ?" />  -->
    <property name="cronExpression" value="0 52 11 ? * *" />
 </bean>

這在正確的時間點火。 deleteDBMaster方法調用此代碼:

        //get Document files not having any links
        List<DocumentFile> strayFiles = documentDaoImpl.getStrayDocumentFiles();
        try
        {
            if (strayFiles.size() > 0)
            {
                //delete
                strayFiles = documentDaoImpl.softDelete(strayFiles, DocumentFile.class);
                documentDaoImpl.saveOrUpdateAll(strayFiles);}
}...

softDelete方法使用泛型

    @Override
public <T extends GenericEntity> List<T> softDelete(List<T> stray,
        Class<T> clazz)
{
    for (T tObj : stray)
    {
        clazz.cast(tObj).setActive(Constants.INACTIVE.getVal());

    }
    return stray;
}

當我調試時,我在saveOrUpdateAll()方法中看到strayFiles列表中對象的active屬性中的值已更改。 saveOrUpdateAll方法是:

@Override
public void saveOrUpdateAll(Collection<?> objects) throws DMSException  {
    try {
        for (Object object : objects) {
            getCrntSession().saveOrUpdate(object);
        }
    } catch (final HibernateException e) {
        throw new DMSException("Exception while save or update All ", ErrorCode.BASE_DB_ERROR, e);
    }
} 

調用saveorupdate時,hibernate不會記錄任何查詢。 db中沒有任何變化!!

由於這是在spring集成中,我剛剛在方法中添加了@Transactional。 我假設spring必須執行flush或commit。 那是錯的嗎? 即便如此,我應該看到查詢正確?

請讓我知道代碼中有什么問題......

謝謝

編輯::

將我的softdelete代碼更改為以下內容。 想到也許仿制葯正在造成這種情況。

    @Override
@Transactional
public void softDeleteDocumentFile(
        List<DocumentFile> stray)
{
    for (DocumentFile tObj : stray)
    {
        tObj.setActive(Constants.INACTIVE.getVal());
        saveEntity(tObj);
    }
}

仍然沒有變化。 行未更新。 Hibernate沒有在控制台上打印更新查詢!!

如果有人發現代碼中有任何錯誤,請告訴我。

編輯::

這是配置

    <mvc:annotation-driven />

<context:component-scan base-package="com.polling" />
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
     <context:property-placeholder location="classpath:config/jdbc.properties,classpath:config/config.properties,classpath:config/ftp.properties"/>
      <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        >
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        </bean>
      <!-- Configure Hibernate 4 Session Factory -->
      <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

            <property name="dataSource">
                  <ref bean="dataSource" />
            </property>

            <property name="hibernateProperties">
                  <props>
                        <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                        <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                        <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                        <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
                  </props>
            </property>
            <property name="packagesToScan">
            <list>
                <value>com.polling.entity</value>
            </list>
        </property>
            </bean>
            <tx:annotation-driven />
<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

編輯::

嘗試使用硬編碼的id。 使用更新而不是保存。 但仍然是相同的結果,沒有更新查詢,因此行沒有變化!

編輯::這是跟蹤級別的日志

    14:31:12.644 T|TransactionInterceptor                  |Completing transaction for [com.polling.service.DocumentServiceImpl.deActivateStrays]
14:31:12.644 T|TransactionInterceptor                  |Completing transaction for [com.polling.scheduler.job.DMSDBDetectionJob.deleteDBMaster]
14:31:12.675 T|HibernateTransactionManager             |Triggering beforeCommit synchronization
14:31:12.675 T|HibernateTransactionManager             |Triggering beforeCompletion synchronization
14:31:12.675 D|HibernateTransactionManager             |Initiating transaction commit
14:31:12.675 D|HibernateTransactionManager             |Committing Hibernate transaction on Session [SessionImpl(PersistenceContext[entityKeys=[EntityKey[com.polling.entity.DocumentFile#273], EntityKey[com.polling.entity.DocumentGroup#107], EntityKey[com.polling.entity.DocumentFile#275]],collectionKeys=[CollectionKey[com.polling.entity.DocumentFile.docgroups#275], CollectionKey[com.polling.entity.DocumentGroup.files#107], CollectionKey[com.polling.entity.DocumentFile.docgroups#273]]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@2a6f7180 updates=org.hibernate.engine.spi.ExecutableList@7a84a043 deletions=org.hibernate.engine.spi.ExecutableList@1935cd8c orphanRemovals=org.hibernate.engine.spi.ExecutableList@1b49af42 collectionCreations=org.hibernate.engine.spi.ExecutableList@291240d collectionRemovals=org.hibernate.engine.spi.ExecutableList@6d5d2cc collectionUpdates=org.hibernate.engine.spi.ExecutableList@40025295 collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@587bd507 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])]
14:31:12.675 D|AbstractTransactionImpl                 |committing
14:31:12.675 T|SessionImpl                             |Automatically flushing session
14:31:12.675 T|AbstractFlushingEventListener           |Flushing session
14:31:12.675 D|AbstractFlushingEventListener           |Processing flush-time cascades
14:31:12.675 T|Cascade                                 |Processing cascade ACTION_SAVE_UPDATE for: com.polling.entity.DocumentFile
14:31:12.675 T|Cascade                                 |Done processing cascade ACTION_SAVE_UPDATE for: com.polling.entity.DocumentFile
14:31:12.675 T|Cascade                                 |Processing cascade ACTION_SAVE_UPDATE for: com.polling.entity.DocumentFile
14:31:12.675 T|Cascade                                 |Done processing cascade ACTION_SAVE_UPDATE for: com.polling.entity.DocumentFile
14:31:12.675 D|AbstractFlushingEventListener           |Dirty checking collections
14:31:12.675 T|AbstractFlushingEventListener           |Flushing entities and processing referenced collections
14:31:12.675 D|Collections                             |Collection found: [com.polling.entity.DocumentFile.docgroups#273], was: [com.polling.entity.DocumentFile.docgroups#273] (uninitialized)
14:31:12.691 D|Collections                             |Collection found: [com.polling.entity.DocumentFile.docgroups#275], was: [com.polling.entity.DocumentFile.docgroups#275] (uninitialized)
14:31:12.691 D|Collections                             |Collection found: [com.polling.entity.DocumentGroup.files#107], was: [com.polling.entity.DocumentGroup.files#107] (uninitialized)
14:31:12.691 T|AbstractFlushingEventListener           |Processing unreferenced collections
14:31:12.691 T|AbstractFlushingEventListener           |Scheduling collection removes/(re)creates/updates
14:31:12.691 D|AbstractFlushingEventListener           |Flushed: 0 insertions, 0 updates, 0 deletions to 3 objects
14:31:12.691 D|AbstractFlushingEventListener           |Flushed: 0 (re)creations, 0 updates, 0 removals to 3 collections
14:31:12.691 D|EntityPrinter                           |Listing entities:
14:31:12.691 D|EntityPrinter                           |com.polling.entity.DocumentFile{encodingKey=yyy, docgroups=<uninitialized>, contactNumber=12121212, documentType=com.polling.entity.DocumentType#5, totalLinks=1, modifiedBy=com.polling.entity.UserApplicationGroup#3, documentFileName=f11, documentDescription=null, totalDownloads=0, uploaderCompletePath=somepath/somepath, modifiedDate=2014-12-16 14:36:57.707, size=0, DMSPath=c:/DMSFinalRoot\dir0\File0, id=273, createdBy=com.polling.entity.UserApplicationGroup#3, documentFormat=com.polling.entity.DocumentFormat#1, uploadDateTime=2014-12-16 14:36:56.86, keyWords=null, active=3, uploadStage=1, uploaderIP=0:0:0:0:0:0:0:1, createdDate=2014-12-16 14:36:57.707, contactPerson=some name, uploaderName=scmsname}
14:31:12.691 D|EntityPrinter                           |com.polling.entity.DocumentGroup{files=<uninitialized>, expiryPresent=false, modifiedBy=com.polling.entity.UserApplicationGroup#3, uploadStatus=0, documentDescription=null, modifiedDate=2014-12-22 14:28:09.027, id=107, nodeId=206, totalFiles=0, createdBy=com.polling.entity.UserApplicationGroup#3, documentFormat=null, objectId=101, active=3, documentName=doc1, nodeType=document, objectType=demand, createdDate=2014-12-22 14:28:09.027, expiryAt=null}
14:31:12.691 D|EntityPrinter                           |com.polling.entity.DocumentFile{encodingKey=azaz, docgroups=<uninitialized>, contactNumber=12121212, documentType=com.polling.entity.DocumentType#5, totalLinks=1, modifiedBy=com.polling.entity.UserApplicationGroup#3, documentFileName=f11, documentDescription=null, totalDownloads=0, uploaderCompletePath=somepath/somepath, modifiedDate=2014-12-17 16:52:23.163, size=0, DMSPath=c:/DMSFinalRoot\dir2\File0, id=275, createdBy=com.polling.entity.UserApplicationGroup#3, documentFormat=com.polling.entity.DocumentFormat#1, uploadDateTime=2014-12-17 16:52:22.127, keyWords=null, active=9, uploadStage=1, uploaderIP=0:0:0:0:0:0:0:1, createdDate=2014-12-17 16:52:23.163, contactPerson=some name, uploaderName=scmsname}
14:31:12.691 T|AbstractFlushingEventListener           |Executing flush
14:31:12.691 T|JdbcCoordinatorImpl                     |Starting after statement execution processing [ON_CLOSE]
14:31:12.691 T|AbstractFlushingEventListener           |Post flush
14:31:12.691 T|SessionImpl                             |before transaction completion
14:31:12.691 D|JdbcTransaction                         |committed JDBC Connection
14:31:12.691 D|JdbcTransaction                         |re-enabling autocommit
14:31:12.691 T|TransactionCoordinatorImpl              |after transaction completion
14:31:12.707 T|SessionImpl                             |after transaction completion
14:31:12.707 T|HibernateTransactionManager             |Triggering afterCommit synchronization
14:31:12.707 T|HibernateTransactionManager             |Triggering afterCompletion synchronization
14:31:12.707 T|TransactionSynchronizationManager       |Clearing transaction synchronization
14:31:12.707 T|TransactionSynchronizationManager       |Removed value [org.springframework.orm.hibernate4.SessionHolder@711fbb66] for key [org.hibernate.internal.SessionFactoryImpl@5e2ed6a9] from thread [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-7]
14:31:12.707 T|TransactionSynchronizationManager       |Removed value [org.springframework.jdbc.datasource.ConnectionHolder@67914078] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@7bc247d0] from thread [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-7]
14:31:12.707 D|HibernateTransactionManager             |Closing Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[EntityKey[com.polling.entity.DocumentFile#273], EntityKey[com.polling.entity.DocumentGroup#107], EntityKey[com.polling.entity.DocumentFile#275]],collectionKeys=[CollectionKey[com.polling.entity.DocumentFile.docgroups#275], CollectionKey[com.polling.entity.DocumentGroup.files#107], CollectionKey[com.polling.entity.DocumentFile.docgroups#273]]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@2a6f7180 updates=org.hibernate.engine.spi.ExecutableList@7a84a043 deletions=org.hibernate.engine.spi.ExecutableList@1935cd8c orphanRemovals=org.hibernate.engine.spi.ExecutableList@1b49af42 collectionCreations=org.hibernate.engine.spi.ExecutableList@291240d collectionRemovals=org.hibernate.engine.spi.ExecutableList@6d5d2cc collectionUpdates=org.hibernate.engine.spi.ExecutableList@40025295 collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@587bd507 unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] after transaction
14:31:12.707 T|SessionImpl                             |Closing session
14:31:12.707 I|StatisticalLoggingSessionEventListener  |Session Metrics {
    36322379 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    16153296 nanoseconds spent preparing 2 JDBC statements;
    20467177 nanoseconds spent executing 2 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    7830765 nanoseconds spent executing 1 flushes (flushing a total of 3 entities and 3 collections);
    85953666 nanoseconds spent executing 2 partial-flushes (flushing a total of 2 entities and 2 collections)
}

找到了問題的症結所在。 根本不涉及交易。 我錯誤地將updatable = false添加到我的實體類屬性(活動)get訪問器中。 抱歉,添麻煩了。 真的是一個非常基本的錯誤! 向所有花時間在這上面的人致歉

session.saveOrUpdate(Object)方法只將任何臨時對象轉換為持久對象,意味着對象與當前的hibernate會話關聯。 當刷新當前的hibernate會話或提交hibernate事務時,只會運行實際的查詢來將對象數據存儲到數據庫中。

Hibernate saveOrUpdate(Object)的工作方式與上面的注釋類似。 我對Spring不太了解。 我希望上面的描述對你有用。

示例代碼:Hibernate

Session session = sessionFactory.getCurrentSession();
session.setFlush(FlushMode.COMMIT);// Session will be flushed when transation.commit will be called
Transaction tx = session.beginTransaction();
session.saveOrUpdate(Object obj);
tx.commit();// this line will run query to map your object on database

 OR

Session session = sessionFactory.getCurrentSession();
session.setFlush(FlushMode.MANUAL);// Session will be only ever flushed when session.flush() will be explicitely called by aaplication
Transaction tx = session.beginTransaction();
session.saveOrUpdate(Object obj);
session.flush();// this line will run query to map your object on database
tx.commit();

謝謝

到目前為止您所寫的內容似乎是您的Spring TransactionManagement配置錯誤。

如果您不想配置方面,一個簡單的解決方案是使用Spring Framework TransactionTemplate的編程方法

public class DMSDBDetectionJob {

    private final TransactionTemplate transactionTemplate;

    public DMSDBDetectionJob(PlatformTransactionManager transactionManager) {
       Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null.");
       this.transactionTemplate = new TransactionTemplate(transactionManager);
       // optional configuration of the Transaction like timeout
       // this.transactionTemplate.setTimeout(30); // 30 seconds
    }

    public void deleteDBMaster() {
      transactionTemplate.execute(new TransactionCallbackWithoutResult() {
          protected void doInTransactionWithoutResult(TransactionStatus status) {
             deleteDBMasterImpl();
         }
       });

    }

    private void deleteDBMasterImpl() {
        List<DocumentFile> strayFiles = documentDaoImpl.getStrayDocumentFiles();
        try
        {
           if (strayFiles.size() > 0)
           {
              //delete
              strayFiles = documentDaoImpl.softDelete(strayFiles, DocumentFile.class);
              documentDaoImpl.saveOrUpdateAll(strayFiles);
              ...
            }

         } catch (...) {...}
    }

您的Spring配置至少應包含兩個條目:

<!-- PlatformTransactionManager which are going to drive transaction-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
</bean>

<!-- Instance of transaction template -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
  <property name="transactionManager" ref="transactionManager"></property>
</bean>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM