Java SpringJPA/Hibernate在使用@modify和@Query进行特殊更新之前调用fullupdate
我有一个用于类业务的spring存储库: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
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不是一个好主意,除非它适合您的情况。为了更好的设计,你最好重构你的代码
这些信息可以帮助您:
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);
}