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

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

下面显示了一个示例,以更好地说明这一点。

MyEntity类代表实体。
MyEntityRepository类是用于为MyEntity实体执行数据库交互的Spring Data Repository。
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) { ... }

}

参考方案

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

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Spring Boot:java.time.Duration的默认序列化从字符串更改为数字 - java

我们最近从Spring Boot 2.1.9升级到2.2.1,这导致我们的测试失败。调查导致结果,默认情况下java.time.Duration类型现在序列化为不同的序列。现在,我们将得到"PT15M",而不是在JSON消息中包含字符串"900.0"。 POJO定义如下所示@JsonProperty(required …

Spring Boot-使用上下文路径时在根级别的静态内容 - java

假设我有一个application.yml内容server: port: 8000 context-path: /rest 因此,将像这样访问所有控制器和htmlhttp://server:8000/rest/controller因此,具有此配置...有可能在不更改其上下文路径的情况下将一些静态html元素添加到其根级别? (我已经将index.html添加…

IntelliJ Spring MVC教程部署 - java

我尝试了tutorial,当我尝试部署webapp(IntelliJ 13.1.4 Ultimate)时,出现了一个奇怪的错误,如下面的屏幕快照所示。解决此错误的方法是什么? org.jdom.input.JDOMParseException: Error on line 742: The content of elements must consist o…