当前位置: 首页 > 知识库问答 >
问题:

在Spring framework中,从数据库中提取已保存的实体以与已修改的、未保存的实体进行比较

谷涵容
2023-03-14

使用Java和Spring,我有一个被修改但尚未持久化的实体。我想把它和它的原始状态,数据库中仍然存在的状态进行比较。但是,当我为实体执行获取以获得旧状态时,它总是返回修改状态的实体。

为了更好地说明这一点,下面给出了一个例子。

    null

从存储库中提取oldEntity并与Entity进行比较。但是,当这样做时,oldEntity始终与Entity相同。(Entity中更改的值反映在oldEntity中。)

由于entity尚未保存,我如何获取实体的状态,因为它当前存在于数据库中而不是当前上下文中?是否可以使用Spring注释或设置一个传播值,使其离开当前持久性上下文以获取实体,从而使其成为真实的、持久化的值而不是当前上下文中的值?

@Service
public class MyService {
    @Autowire
    private MyEntityRepository repository;

    @Transactional
    public boolean save(MyEntity entity) {
        MyEntity oldEntity = repository.findOne(entity.getId());
        if (entity.compareTo(oldEntity) != 0) {
            repository.save(entity);
        } 
    }
}

public interface MyEntityRepository extends PagingAndSortingRepository<MyEntity, Long> {
    MyEntity findByName(String name);
}

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Column(nullable = false)
    protected String name;

    public Long getId() { ... }
    public void setId(Long id) { ... }
    public String getName() { ... }
    public void setName(String name) { ... }
    public int compareTo(MyEntity entity) { ... }

}

共有1个答案

柳修为
2023-03-14

您需要记住事务如何与实体工作的行为。当您在事务中执行myEntityEntity=myEntityRepository.findByName(“test”);并调用诸如entity.setName();之类的内容时,一旦事务完成,数据库中的name列将被更新。在调用setname以停止更新数据库之前,需要使用实体管理器删除事务中的实体。但如果要保存对name的更改,则需要重新添加它。

 类似资料:
  • 我是Hibernate的新手,并要求使用具有这些列的表的数据库 表:TBL _ product//库存项目列表< br >列:< br > key _ product < br > key _ category < br > fld _ product _ name < br > fld _ Inventory _ qty < br > fld _ unit _ price < br > fld

  • 我正在尝试开发一个小型电子商务项目。我有一个篮子和篮子项目实体。我只是想当我为客户保存购物篮时,我想把购物篮项目保存在数据库中。我认为我不应该为篮子项目创建存储库。我应该能够保存篮子项目,同时使用篮子存储库保存篮子。 在这里,我试图通过篮子服务获得一个篮子项目,并将其设置为篮子实体并保存它。 我有什么问题?我有个例外。

  • 问题内容: 我有一个奇怪的问题,这是我以前从未经历过的。我使用实体框架检索我的记录。 我有以下电话: 我希望此调用不会缓存。因此,当我进行此调用时,我希望它可以查询数据库并检索最新的对象。但是,事实并非如此。 我称此方法为相距相对较短时间的相对两倍(约5-10秒)。但是在此期间,该表中的十进制值可以由某些第三方更改。 但是,即使值更改,该调用也会检索未更新的版本。 情况示例 : 我拨打电话,看到该

  • 我有一个实体CandidateTransaction和CandidateTransactionRepository扩展了CrudRepository 我正在使用CrudRepository的save方法来保存所述实体的对象。当实体没有行时,它将创建一个自动生成的键并将其插入ID列,而不需要Java端的干预。 而且,由于CrudRepository的save()方法检查实体是否是新的,如果是新的,它

  • 我已经做了几个小时了,似乎找不到问题所在。 下面是我的数据库模式: 这是我的课程: 这是我的任务类: 因此,我的H2数据库结构如下: 我试图通过Rest控制器给学生添加一个任务(Rest控制器工作正常): 这是我的类: 以下是代码中的日志: 如你所见,任务似乎确实被添加到数据库中——除了它没有:( ☝️ 应该有一个“4,3”(4是任务id,3是学生“编号”)。 哦,当我在做的时候,这是我的类: 我

  • 我的问题很简单,但找到解决办法却成了一项相当乏味和困难的任务。 我有两个冬眠实体, (或“父”实体)有三个字段, (实体的集合-关系)。 当从的集合中删除时(从对象的集合中删除和通过Dog存储库从数据库中删除),以及更新所有者的地址,然后尝试将更新后的对象保存到数据库中,将引发以下异常: 解决这个问题的一种方法是,在更新集合后,通过使用调用所有者的,获取的新版本,然后更新所有者的地址并将实体保存到