使用Java和Spring,我有一个被修改但尚未被持久化的实体。我想将它与原始状态进行比较,状态仍然存在于数据库中。但是,当我对实体进行获取以获取旧状态时,它总是返回 modified 状态中的实体。
更好地说明这一点的一个例子如下所示。
MyEntity
类代表实体。MyEntityRepository
类是Spring Data Repository,用于为MyEntity
实体执行数据库交互。MyService
类有一个名为save
的事务方法,它将新版本的MyEntity(名为entity
)与oldEntity
进行比较。如果entity
和oldEntity
不同,则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) { ... }
}
答案 0 :(得分:0)
您需要记住事务如何与实体一起使用的行为。当您执行MyEntity entity = myEntityRepository.findByName("test");
并在事务中调用entity.setName();
之类的内容时,一旦事务完成,数据库中的名称列将被更新。在调用setName
以阻止数据库更新之前,您将需要使用实体管理器删除事务中的实体。但是,如果您想将更改保存到名称,则需要重新添加它。