Java 在Spring框架中,从数据库中获取保存的实体,以与修改的、未保存的实体进行比较

Java 在Spring框架中,从数据库中获取保存的实体,以与修改的、未保存的实体进行比较,java,spring,spring-data,spring-data-jpa,Java,Spring,Spring Data,Spring Data Jpa,使用Java和Spring,我有一个已修改但尚未持久化的实体。我想将其与原始状态进行比较,即数据库中仍然存在的状态。但是,当我提取实体以获取旧状态时,它总是返回处于修改状态的实体 为了更好地说明这一点,下面给出了一个示例 MyEntity类表示实体 MyEntityRepository类用于为MyEntity实体执行数据库交互 MyService类有一个名为save的事务方法,该方法将MyEntity的新版本(名为entity)与oldEntity进行比较。如果实体和旧实体不同,则将实体保存

使用Java和Spring,我有一个已修改但尚未持久化的实体。我想将其与原始状态进行比较,即数据库中仍然存在的状态。但是,当我提取实体以获取旧状态时,它总是返回处于修改状态的实体


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

  • MyEntity
    类表示实体
  • MyEntityRepository
    类用于为
    MyEntity
    实体执行数据库交互
  • MyService
    类有一个名为
    save
    的事务方法,该方法将MyEntity的新版本(名为
    entity
    )与
    oldEntity
    进行比较。如果
    实体
    旧实体
    不同,则将
    实体
    保存到数据库中;否则,将不保存它
将从存储库中提取
旧实体
,并与
实体
进行比较。但是,完成此操作后,
旧实体
始终与
实体
相同。(在
实体
中更改的值反映在
旧实体
中)

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


@服务
公共类MyService{
@自动连线
私人髓质保存库;
@交易的
公共布尔保存(MyEntity实体){
MyEntity oldEntity=repository.findOne(entity.getId());
如果(实体比较到(旧实体)!=0){
保存(实体);
} 
}
}
公共接口MyEntityRepository扩展了分页和排序存储库{
MyEntity findByName(字符串名称);
}
@实体
公共类MyEntity{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
保护长id;
@列(nullable=false)
受保护的字符串名称;
公共长getId(){…}
公共无效集合id(长id){…}
公共字符串getName(){…}
公共无效集合名(字符串名){…}
公共整数比较(MyEntity实体){…}
}

您需要记住事务如何与实体一起工作的行为。当您执行
MyEntity entity=myEntityRepository.findByName(“测试”)
并调用类似于
entity.setName()的东西
在事务中,则一旦事务完成,数据库中的name列将被更新。在调用
setName
停止更新数据库之前,需要使用实体管理器删除事务中的实体。但是,如果要保存对名称的更改,则需要重新添加它。

这样做的用例是什么?根据您的提供程序,当要执行的查询依赖于当前持久性上下文中的新实体或更新实体时,可能会发生刷新。这就解释了您看到的情况—您的提供者刷新挂起的更改以确保即将发出的查询的一致性。O@MarkOfHall当且仅当几个实体属性中的一个发生变化时,我的特定用例才会调用额外的处理。因此,我想获取保存的实体状态,并将其与修改后的实体状态进行比较。
@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) { ... }

}