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

时间:2017-01-25 02:33:26

标签: java spring spring-data spring-data-jpa

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

更好地说明这一点的一个例子如下所示。

  • MyEntity类代表实体。
  • MyEntityRepository类是Spring Data Repository,用于为MyEntity实体执行数据库交互。
  • MyService类有一个名为save的事务方法,它将新版本的MyEntity(名为entity)与oldEntity进行比较。如果entityoldEntity不同,则entity会保存到数据库中;否则,它不会被保存。

从存储库中提取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 个答案:

答案 0 :(得分:0)

您需要记住事务如何与实体一起使用的行为。当您执行MyEntity entity = myEntityRepository.findByName("test");并在事务中调用entity.setName();之类的内容时,一旦事务完成,数据库中的名称列将被更新。在调用setName以阻止数据库更新之前,您将需要使用实体管理器删除事务中的实体。但是,如果您想将更改保存到名称,则需要重新添加它。