【问题标题】:Update via @Modifying @Query in Spring Data not working在 Spring Data 中通过 @Modifying @Query 更新不起作用
【发布时间】:2015-01-27 10:42:35
【问题描述】:

我定义了以下存储库:

@Repository
public interface IntegrationPeriodConstraintsRepository extends CrudRepository<IntegrationPeriodConstraint, IntegrationPeriod>
{
    @Query("select case when (count(ipc) > 0) then true else false end from IntegrationPeriodConstraint ipc where ipc.m_enabled = true")
    boolean hasEnabledConstraints();

    @Modifying
    @Query("update IntegrationPeriodConstraint ipc set ipc.m_lastIntegrationTimeIntegratedData = :time where ipc.m_integrationPeriod = :integrationPeriod")
    void setLastIntegrationTimeIntegratedData( @Param("integrationPeriod") IntegrationPeriod integrationPeriod,
                                               @Param("time") DateTime lastIntegrationTime );
}

但是,这个setLastIntegrationTimeIntegratedData 方法似乎不起作用。我有一个使用嵌入式 H2 数据库的单元/集成测试,显示调用后,数据库中没有更新。

我启用了 Hibernate 日志记录,它显示如下:

2015-01-27 11:49:13 DEBUG [main] AnnotationTransactionAttributeSource - Adding transactional method 'IntegrationPeriodConstraintsServiceImpl.setLastIntegrationTime' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2015-01-27 11:49:13 DEBUG [main] AnnotationTransactionAspect - Skipping transactional joinpoint [com.company.server.common.service.message.impl.IntegrationPeriodConstraintsServiceImpl.setLastIntegrationTime] because no transaction manager has been configured
2015-01-27 11:49:13 DEBUG [main] AbstractFlushingEventListener - Processing flush-time cascades
2015-01-27 11:49:13 DEBUG [main] AbstractFlushingEventListener - Dirty checking collections
2015-01-27 11:49:13 DEBUG [main] AbstractFlushingEventListener - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
2015-01-27 11:49:13 DEBUG [main] AbstractFlushingEventListener - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
2015-01-27 11:49:13 DEBUG [main] EntityPrinter - Listing entities:
2015-01-27 11:49:13 DEBUG [main] EntityPrinter - com.traficon.domain.system.IntegrationPeriodConstraint{m_integrationPeriod=MINUTES_1, m_lastIntegrationTimeIntegratedData=null, m_enabled=true, m_lastIntegrationTimePresenceData=null, m_storageSingleFieldPeriod=PT6M, m_lastIntegrationTimeFlowData=null, m_lastIntegrationTimeBicycleData=null}
2015-01-27 11:49:13 DEBUG [main] SQL - update IntegrationPeriodConstraint set lastIntegrationTimeIntegratedData=? where integrationPeriod=?
2015-01-27 11:49:13 TRACE [main] BasicBinder - binding parameter [1] as [TIMESTAMP] - 2015-01-27 11:49:13.81
2015-01-27 11:49:13 DEBUG [main] JpaTransactionManager - Found thread-bound EntityManager [org.hibernate.ejb.EntityManagerImpl@5f0e6817] for JPA transaction
2015-01-27 11:49:13 DEBUG [main] JpaTransactionManager - Participating in existing transaction

我觉得奇怪的是第二个参数没有记录?

这是我使用的 Hibernate 映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.mycompany.domain.system" default-access="field">


    <class name="IntegrationPeriodConstraint" table="IntegrationPeriodConstraint">

        <id name="m_integrationPeriod" column="integrationPeriod">
            <type name="com.mycompany.persistence.impl.hibernate.usertype.EnumUserType">
                <param name="enumClass">com.mycompany.domain.message.data.IntegrationPeriod</param>
            </type>

            <generator class="assigned"/>
        </id>

        <property name="m_storageSingleFieldPeriod" not-null="true"
                  type="com.mycompany.persistence.impl.hibernate.usertype.BaseSingleFieldPeriodUserType">
            <column name="storagePeriodType"/>
            <column name="storagePeriodValue"/>
        </property>

        <property name="m_enabled" not-null="true" column="enabled"/>

        <property name="m_lastIntegrationTimeIntegratedData" column="lastIntegrationTimeIntegratedData" type="org.jadira.usertype.dateandtime.joda.PersistentDateTime"/>
        <property name="m_lastIntegrationTimeFlowData" column="lastIntegrationTimeFlowData" type="org.jadira.usertype.dateandtime.joda.PersistentDateTime"/>
        <property name="m_lastIntegrationTimePresenceData" column="lastIntegrationTimePresenceData" type="org.jadira.usertype.dateandtime.joda.PersistentDateTime"/>
        <property name="m_lastIntegrationTimeBicycleData" column="lastIntegrationTimeBicycleData" type="org.jadira.usertype.dateandtime.joda.PersistentDateTime"/>
    </class>

</hibernate-mapping>

【问题讨论】:

  • 我在日志中注意到because no transaction manager has been configured。但是我有一个JpaTransactionManager bean 和@EnableTransactionManagement,所以我不知道为什么会这样。但我认为这与它无关。
  • 我可以确认事务管理器警告与它无关。 stackoverflow.com/questions/3573188/… 涵盖了该问题,我应用了修复程序,它没有任何区别。

标签: java hibernate spring-data


【解决方案1】:

用@Modifying(clearAutomatically = true) 替换@Modifying 应该可以工作。

【讨论】:

  • 在我的情况下,将 java 8 更新到 11 后,修改后的查询在集成测试中停止工作,在设置属性 clearAutomatically = true 后它工作正常,但对我来说看起来很奇怪。解决问题的另一种方法是开始使用手动事务,如 TestTransaction.start()end() 内部测试。
【解决方案2】:

这似乎与它应该的方式相反

name="m_lastIntegrationTimeIntegratedData" column="lastIntegrationTimeIntegratedData"

Column 是数据库中列的名称,name 是实体中的属性。

【讨论】:

  • 我们在 Java 代码中使用了m_ 约定,所以这是正确的
【解决方案3】:

您可以检查此 Spring Data JPA(在修改查询下):
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#reference

还有这个:

https://www.baeldung.com/spring-data-jpa-modifying-annotation

这对我有用:

@Transactional
@Modifying(flushAutomatically = true)
@Query("UPDATE User a SET a.activeStatus=?1 WHERE a.username=?2")
int setUserActiveStatusFlag(int activeStatus,String username);

对于我使用的@Transactional:javax.transaction.Transactional

【讨论】:

    【解决方案4】:

    这样做可以解决问题,因为它解决了我的问题

    @Transactional
    @Modifying(flushAutomatically = true)
    @Query("update IntegrationPeriodConstraint ipc set ipc.m_lastIntegrationTimeIntegratedData = :time where ipc.m_integrationPeriod = :integrationPeriod")
    void setLastIntegrationTimeIntegratedData(@Param("integrationPeriod") IntegrationPeriod integrationPeriod, @Param("time") DateTime lastIntegrationTime );
    

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 2018-03-20
      • 2014-05-23
      • 1970-01-01
      • 2021-03-31
      • 2020-05-09
      • 2020-12-10
      • 2018-01-26
      • 2018-10-07
      相关资源
      最近更新 更多