Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringJPA/Hibernate在使用@modify和@Query进行特殊更新之前调用fullupdate_Java_Spring_Spring Data_Spring Data Jpa - Fatal编程技术网

Java SpringJPA/Hibernate在使用@modify和@Query进行特殊更新之前调用fullupdate

Java SpringJPA/Hibernate在使用@modify和@Query进行特殊更新之前调用fullupdate,java,spring,spring-data,spring-data-jpa,Java,Spring,Spring Data,Spring Data Jpa,我有一个用于类业务的spring存储库: public interface BusinessRepository extends JpaRepository<Business, String> { 问题是当我调用此方法时: businessRepository.setUpdateDatetimeForBusiness(business.getUpdateDatetime(), business.getBusinessKey()); 日志显示了以下内容: Hibernate: up

我有一个用于类业务的spring存储库:

public interface BusinessRepository extends JpaRepository<Business, String> {
问题是当我调用此方法时:

businessRepository.setUpdateDatetimeForBusiness(business.getUpdateDatetime(), business.getBusinessKey());
日志显示了以下内容:

Hibernate: update business set name=?, timezone=?, updatedatetime=? where business_id=?
Hibernate: update business set updatedatetime=? where business_id=?
该方法调用实体的完整更新,然后调用my update。我应该更改什么来调用第二次更新

@Query(value="update something", nativeQuery=true)
nativeQuery=true
尝试添加此


更新

对不起,我没有仔细阅读这个问题

由于你提供的炎症,我找不出问题所在。但我确实有 给你的建议

EntityManager
管理的实体可以自动持久化到数据库中,您可以记录
Hibernate:updatebusinesssetname=?,timezone=?,updatedatetime=?其中business_id=?
似乎更新了所有字段?如果是这样,则更新更可能由
EntityManager
调用

您可以将
flushMode
更改为
COMMIT
,以查看是否有更改。(仅用于测试问题是否由
EntityManager
的自动更新引起)
例如:
spring.jpa.properties.org.hibernate.flushMode=COMMIT
在spring引导中


我的测试代码:

服务:

import cn.eeemt.dao.TagRepository;
import cn.eeemt.entity.Tag;
import cn.eeemt.service.TagService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Optional;

@Service
public class TagServiceImpl implements TagService {

    @Resource
    private TagRepository tagRepository;

    @Override
    public void update(String newDescription) {
        Tag tag = step1(newDescription);
        step2(tag.getDescription(), tag.getId());
    }

    @Transactional
    public Tag step1(String newDescription) {
        Optional<Tag> byId = tagRepository.findById(1);
        Tag tag = byId.orElseThrow(RuntimeException::new);
        System.out.println(tag);
        tag.setDescription(newDescription);
        // tagRepository.save(byId.get());  // I did not update it!!!
        return tag;
    }

    private void step2(String description, Integer id) {
        tagRepository.updateSome(description, id);
    }
}  
导入cn.eeemt.dao.TagRepository;
导入cn.eeemt.entity.Tag;
进口cn.eeemt.service.TagService;
导入org.springframework.stereotype.Service;
导入org.springframework.transaction.annotation.Transactional;
导入javax.annotation.Resource;
导入java.util.Optional;
@服务
公共类TagServiceImpl实现TagService{
@资源
私有标记库标记库;
@凌驾
公共无效更新(字符串newDescription){
标签标签=步骤1(新描述);
步骤2(tag.getDescription(),tag.getId());
}
@交易的
公共标记步骤1(字符串newDescription){
可选byId=tagRepository.findById(1);
Tag Tag=byId.orelsetrow(RuntimeException::new);
系统输出打印项次(标签);
tag.setDescription(newDescription);
//tagRepository.save(byId.get());//我没有更新它!!!
返回标签;
}
私有void步骤2(字符串描述,整数id){
tagRepository.updateSome(描述,id);
}
}  
存储库:

import cn.eeemt.entity.Tag;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

public interface TagRepository extends JpaRepository<Tag, Integer> {

    @Modifying
    @Transactional
    @Query("update Tag tag set tag.description = :description where tag.id = :id")
    void updateSome(@Param("description") String description, @Param("id") int id);
}
import cn.eeemt.entity.Tag;
导入org.springframework.data.jpa.repository.JpaRepository;
导入org.springframework.data.jpa.repository.Modifying;
导入org.springframework.data.jpa.repository.Query;
导入org.springframework.data.repository.query.Param;
导入org.springframework.transaction.annotation.Transactional;
公共接口标记库扩展了JpaRepository{
@修改
@交易的
@查询(“更新标记集Tag.description=:description,其中Tag.id=:id”)
void updateSome(@Param(“description”)字符串描述,@Param(“id”)int-id);
}
spring.jpa.properties.org.hibernate.flushMode=始终

日志看起来像:

标签{id=1,name='ffadsfasd',description='dasfadsg',articles=[]}
Hibernate:更新标记集描述=?,名称=?其中id=?
Hibernate:更新标记集说明=?其中id=

spring.jpa.properties.org.hibernate.flushMode=COMMIT

日志看起来像:

标签{id=1,name='ffadsfasd',description='dasfadsgaaer',articles=[]}
Hibernate:更新标记集说明=?其中id=


如果问题与我上面所说的一致,那么改变flushMode不是一个好主意,除非它适合您的情况。为了更好的设计,你最好重构你的代码


这些信息可以帮助您:


如果OP想要使用JPQL怎么办?这与当前的问题有什么关系?您能发布调用该方法的代码吗?在事务结束时,对事务中持久实体所做的更新将自动刷新。所以我猜您已经在事务中加载并修改(设置updateDateTime)了一个持久实体。当事务方法返回时,实体管理器将刷新更改。
import cn.eeemt.entity.Tag;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

public interface TagRepository extends JpaRepository<Tag, Integer> {

    @Modifying
    @Transactional
    @Query("update Tag tag set tag.description = :description where tag.id = :id")
    void updateSome(@Param("description") String description, @Param("id") int id);
}