首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring引导: DB实体未被更新-使用过渡性@注释

Spring引导: DB实体未被更新-使用过渡性@注释
EN

Stack Overflow用户
提问于 2021-05-01 16:23:45
回答 2查看 797关注 0票数 2

我有一个更新列值的方法,方法使用批注@来进行事务管理。

解释问题的示例代码:

代码语言:javascript
复制
@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
   }

}

问题:

我使用saveAndFlush,以便将更新后的名称提交给数据库。但是在下一个循环中,当我从a视图(这是一个组合"SomeClass“并包含我们更新的列"NAME”)和其他一些表获得数据时。在my循环中,记录被打印为“堆栈溢出”。

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

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

代码语言:javascript
复制
@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
       }
}

SOME_CLASS存储库:

代码语言:javascript
复制
@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {

}

VIEW_OBJECT存储库:

代码语言:javascript
复制
@Repository
public class ViewObjectRepository extends JpaRepository<ViewObjects, Long> {
@Query(value="select * from VIEW_OBJECTS", nativeQuery = true)
    List<ViewObjects> getRecord();
}

需要输出:

我想得到更新的记录与更新的名称列。

EN

回答 2

Stack Overflow用户

发布于 2021-05-01 20:53:06

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

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

但是如果"VIEW_OBJECTS“不是一个表,而是一个视图,那么请提供关于数据库模式("SOME_CLASS”和"VIEW_OBJECTS")的更详细信息。另外,请提供SomeClass和ViewObjects实体的代码(包含所有JPA注释)。查看数据库属性文件也很好,因此我们可以看到您的jdbc属性、使用哪个数据库、使用哪个jpa提供程序和所有其他属性,这些属性可能与您的事务配置相关。

否则,以下更改应修复此问题:

代码语言:javascript
复制
@Repository
public class SomeClassRepository extends JpaRepository<SomeClass, Long> {
@Query(value="select * from SOME_CLASS", nativeQuery = true)
    List<SomeClass> getRecord();
}

第二种方法应该使用someClassRepository:

代码语言:javascript
复制
@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
       }
}
票数 0
EN

Stack Overflow用户

发布于 2021-05-02 18:28:41

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

  1. 打开您的数据库客户端
  2. 是更新的对应SOME_CLASS表记录的名称?
  3. 如果“否”,那么您的jdbc或jpa配置就会出现问题。请提供有关jdbc配置、jpa配置的更多信息,您使用的是哪个数据库。另外,查看日志:可能根本没有触发任何sql语句?
  4. 如果“是”,则转到5
  5. 是已更新的通讯员VIEW_OBJECTS视图记录的名称?
  6. 如果“否”,那么问题就在您的VIEW_OBJECTS视图中。请提供VIEW_OBJECTS视图的SQL定义,这样我们就可以更好地理解问题所在。
  7. 如果“是”,那么问题就在ViewObjects实体中。请为您提供"ViewObjects“类的代码,以便我们更好地理解

的问题是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67348431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档