Java Spring boot:DB实体未得到更新-使用过渡@Annotation

Java Spring boot:DB实体未得到更新-使用过渡@Annotation,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,我有一个更新列值的方法,该方法使用注释@Transactional进行事务管理 解释问题的示例代码: @Transactional public void methodName(List<SomeClass> listofObjects){ for(someObject sm : listOfObjects){ sm.setName(" lets Assume we are using some dynamic name here "); // as

我有一个更新列值的方法,该方法使用注释@Transactional进行事务管理

解释问题的示例代码:

@Transactional
public void methodName(List<SomeClass> listofObjects){

  for(someObject sm : listOfObjects){
    sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
    someClassRepository.saveAndFlush(sm);
  }

  // Now lets get the list records from DB, by using some native query which retrieves the data 
  // from a DB view, created by combining 3-4 tables and also have the 
  // table "SomeClass" ( used above ) and its 
  // column "Name"

   List<ViewObjects> VO = someRepo.getRecords();
   for(ViewObjects vo : VO){
    sop(vo.getName()); // printing the dynamic names which we updated in above loop
   }

}
@Transactional
public void firstMethod(List<SomeClass> listofObjects){
for(someObject sm : listOfObjects){
        sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
        someClassRepository.saveAndFlush(sm);
      }
}

@Transactional
public void SecondMethod(){
List<ViewObjects> VO = someRepo.getRecords();
       for(ViewObjects vo : VO){
        sop(vo.getName()); // printing the dynamic names which we updated in above loop
       }
}
@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {

}
@Repository
public class ViewObjectRepository extends JpaRepository<ViewObjects, Long> {
@Query(value="select * from VIEW_OBJECTS", nativeQuery = true)
    List<ViewObjects> getRecord();
}
@Transactional
public void方法名(对象列表){
对于(someObject sm:ListoObjects){
sm.setName(“假设我们在这里使用了一些动态名称”);//假设每个记录的旧名称都是“stackoverflow”
saveAndFlush(sm);
}
//现在,让我们使用一些检索数据的本机查询,从数据库中获取列表记录
//从DB视图中,通过组合3-4个表创建,并且还具有
//表“SomeClass”(如上所述)及其
//“名称”列
List VO=someRepo.getRecords();
对于(ViewObjects vo:vo){
sop(vo.getName());//打印我们在上述循环中更新的动态名称
}
}
问题:

@Transactional
public void methodName(List<SomeClass> listofObjects){

  for(someObject sm : listOfObjects){
    sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
    someClassRepository.saveAndFlush(sm);
  }

  // Now lets get the list records from DB, by using some native query which retrieves the data 
  // from a DB view, created by combining 3-4 tables and also have the 
  // table "SomeClass" ( used above ) and its 
  // column "Name"

   List<ViewObjects> VO = someRepo.getRecords();
   for(ViewObjects vo : VO){
    sop(vo.getName()); // printing the dynamic names which we updated in above loop
   }

}
@Transactional
public void firstMethod(List<SomeClass> listofObjects){
for(someObject sm : listOfObjects){
        sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
        someClassRepository.saveAndFlush(sm);
      }
}

@Transactional
public void SecondMethod(){
List<ViewObjects> VO = someRepo.getRecords();
       for(ViewObjects vo : VO){
        sop(vo.getName()); // printing the dynamic names which we updated in above loop
       }
}
@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {

}
@Repository
public class ViewObjectRepository extends JpaRepository<ViewObjects, Long> {
@Query(value="select * from VIEW_OBJECTS", nativeQuery = true)
    List<ViewObjects> getRecord();
}
我正在使用saveAndFlush,以便将更新的名称提交到数据库。 但在下一个循环中,当我从a视图(它是“SomeClass”的组合,还包含我们更新的列“NAME”)和一些其他表中获取数据时。 在我的for循环中,记录打印为“stackoverflow”

我想要我们插入的更新动态名称

我还尝试了两种不同的方法,第一种方法是更新名称,第二种方法是获取DB view的更新名称,但我得到了相同的输出:

@Transactional
public void methodName(List<SomeClass> listofObjects){

  for(someObject sm : listOfObjects){
    sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
    someClassRepository.saveAndFlush(sm);
  }

  // Now lets get the list records from DB, by using some native query which retrieves the data 
  // from a DB view, created by combining 3-4 tables and also have the 
  // table "SomeClass" ( used above ) and its 
  // column "Name"

   List<ViewObjects> VO = someRepo.getRecords();
   for(ViewObjects vo : VO){
    sop(vo.getName()); // printing the dynamic names which we updated in above loop
   }

}
@Transactional
public void firstMethod(List<SomeClass> listofObjects){
for(someObject sm : listOfObjects){
        sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
        someClassRepository.saveAndFlush(sm);
      }
}

@Transactional
public void SecondMethod(){
List<ViewObjects> VO = someRepo.getRecords();
       for(ViewObjects vo : VO){
        sop(vo.getName()); // printing the dynamic names which we updated in above loop
       }
}
@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {

}
@Repository
public class ViewObjectRepository extends JpaRepository<ViewObjects, Long> {
@Query(value="select * from VIEW_OBJECTS", nativeQuery = true)
    List<ViewObjects> getRecord();
}
@Transactional
public void firstMethod(列出对象列表){
对于(someObject sm:ListoObjects){
sm.setName(“假设我们在这里使用了一些动态名称”);//假设每个记录的旧名称都是“stackoverflow”
saveAndFlush(sm);
}
}
@交易的
公共方法(){
List VO=someRepo.getRecords();
对于(ViewObjects vo:vo){
sop(vo.getName());//打印我们在上述循环中更新的动态名称
}
}
某些类存储库:

@Transactional
public void methodName(List<SomeClass> listofObjects){

  for(someObject sm : listOfObjects){
    sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
    someClassRepository.saveAndFlush(sm);
  }

  // Now lets get the list records from DB, by using some native query which retrieves the data 
  // from a DB view, created by combining 3-4 tables and also have the 
  // table "SomeClass" ( used above ) and its 
  // column "Name"

   List<ViewObjects> VO = someRepo.getRecords();
   for(ViewObjects vo : VO){
    sop(vo.getName()); // printing the dynamic names which we updated in above loop
   }

}
@Transactional
public void firstMethod(List<SomeClass> listofObjects){
for(someObject sm : listOfObjects){
        sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
        someClassRepository.saveAndFlush(sm);
      }
}

@Transactional
public void SecondMethod(){
List<ViewObjects> VO = someRepo.getRecords();
       for(ViewObjects vo : VO){
        sop(vo.getName()); // printing the dynamic names which we updated in above loop
       }
}
@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {

}
@Repository
public class ViewObjectRepository extends JpaRepository<ViewObjects, Long> {
@Query(value="select * from VIEW_OBJECTS", nativeQuery = true)
    List<ViewObjects> getRecord();
}
@存储库
公共类SomeClassRepository扩展了JpaRepository{
}
查看对象存储库:

@Transactional
public void methodName(List<SomeClass> listofObjects){

  for(someObject sm : listOfObjects){
    sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
    someClassRepository.saveAndFlush(sm);
  }

  // Now lets get the list records from DB, by using some native query which retrieves the data 
  // from a DB view, created by combining 3-4 tables and also have the 
  // table "SomeClass" ( used above ) and its 
  // column "Name"

   List<ViewObjects> VO = someRepo.getRecords();
   for(ViewObjects vo : VO){
    sop(vo.getName()); // printing the dynamic names which we updated in above loop
   }

}
@Transactional
public void firstMethod(List<SomeClass> listofObjects){
for(someObject sm : listOfObjects){
        sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
        someClassRepository.saveAndFlush(sm);
      }
}

@Transactional
public void SecondMethod(){
List<ViewObjects> VO = someRepo.getRecords();
       for(ViewObjects vo : VO){
        sop(vo.getName()); // printing the dynamic names which we updated in above loop
       }
}
@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {

}
@Repository
public class ViewObjectRepository extends JpaRepository<ViewObjects, Long> {
@Query(value="select * from VIEW_OBJECTS", nativeQuery = true)
    List<ViewObjects> getRecord();
}
@存储库
公共类ViewObjectRepository扩展了JpaRepository{
@查询(value=“select*from VIEW\u OBJECTS”,nativeQuery=true)
List getRecord();
}
需要的输出:

@Transactional
public void methodName(List<SomeClass> listofObjects){

  for(someObject sm : listOfObjects){
    sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
    someClassRepository.saveAndFlush(sm);
  }

  // Now lets get the list records from DB, by using some native query which retrieves the data 
  // from a DB view, created by combining 3-4 tables and also have the 
  // table "SomeClass" ( used above ) and its 
  // column "Name"

   List<ViewObjects> VO = someRepo.getRecords();
   for(ViewObjects vo : VO){
    sop(vo.getName()); // printing the dynamic names which we updated in above loop
   }

}
@Transactional
public void firstMethod(List<SomeClass> listofObjects){
for(someObject sm : listOfObjects){
        sm.setName(" lets Assume we are using some dynamic name here "); // assume old name was "stackoverflow" for every record
        someClassRepository.saveAndFlush(sm);
      }
}

@Transactional
public void SecondMethod(){
List<ViewObjects> VO = someRepo.getRecords();
       for(ViewObjects vo : VO){
        sop(vo.getName()); // printing the dynamic names which we updated in above loop
       }
}
@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {

}
@Repository
public class ViewObjectRepository extends JpaRepository<ViewObjects, Long> {
@Query(value="select * from VIEW_OBJECTS", nativeQuery = true)
    List<ViewObjects> getRecord();
}

我希望获得更新名称列的更新记录。

在您的示例中,SomeClass和ViewObjects是不同的JPA实体,它们映射到不同的数据库表

例如,如果ViewObjects映射到“VIEW_OBJECTS”表,而SomeClass映射到“SOME_CLASS”表,则更新“SOME_CLASS”表当然与“VIEW_OBJECTS”表无关

但如果“视图对象”不是一个表,而是一个视图,那么请提供有关数据库模式的更详细信息(“某些类”和“视图对象”)。 另外,请提供SomeClass和ViewObjects实体(带有所有JPA注释)的代码。也很高兴看到您的数据库属性文件,这样我们就可以看到您的jdbc属性、您使用的数据库、您使用的jpa提供程序以及可能与您的事务配置相关的所有其他属性

否则,以下更改将解决此问题:

@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {
@Query(value="select * from SOME_CLASS", nativeQuery = true)
    List<SomeClass> getRecord();
}
@存储库
公共类SomeClassRepository扩展了JpaRepository{
@查询(value=“select*from SOME_CLASS”,nativeQuery=true)
List getRecord();
}
第二种方法应改用someClassRepository:

@Transactional
public void SecondMethod(){
List<SomeClass> VO = someClassRepository.getRecords();
       for(SomeClass vo : VO){
        sop(vo.getName()); // printing the dynamic names which we updated in above loop
       }
}
@Transactional
公共方法(){
List VO=someClassRepository.getRecords();
对于(某些类vo:vo){
sop(vo.getName());//打印我们在上述循环中更新的动态名称
}
}

您需要直接查看数据库,以了解问题所在

  • 打开数据库客户端
  • 对应的某类表记录的名称是否已更新
  • 如果“否”,则说明jdbc或jpa配置存在问题。请提供有关jdbc配置、jpa配置以及您使用的数据库的更多信息。另外,看看日志:可能根本没有触发sql更新语句
  • 如果“是”,则转到5
  • 对应视图的名称是否已更新
  • 如果“否”,则问题出在您的视图中。请提供视图\对象视图的SQL定义,以便我们更好地了解问题所在
  • 如果“是”,则问题出在ViewObjects实体中。请为“ViewObjects”类提供代码,以便我们更好地了解问题所在

  • 请提供someClassRepository.saveAndFlush(sm)和someRepo.getRecords()的代码(+所有子方法,如果有的话)@MykhailoSkliar我已经用存储库及其代码更新了帖子。saveAndFlush是一种JPA预定义的方法,用于保存和提交数据对象nDB。您在日志中看到生成的更新查询了吗?你使用哪种数据库管理系统?@YuriyTsarkov。是的,我在日志中看到生成的查询,它们看起来都很好。我使用的是Oracle12gDBMSI,您要求我使用相同的类和存储库来获取/print name的值。但是在VIEW_OBJECT entity(它是一个数据库视图,包含来自许多其他表(包括“SomeClass”)的数据)中,我需要很多其他列。这意味着在整个事务(代码块)完成之前,不会向DB提交任何内容。是的,在事务提交之后,数据应该在数据库中。您需要直接查看数据库(步骤1)。从步骤1开始,然后逐步进行,如果需要,请向我们提供更多信息。当前信息不足以帮助您。