首页 > 解决方案 > 在春季数据 jpa 中禁用自动更新

问题描述

我有一个 JPA@Entity课程。我使用 jpa 的findBy一种方法检索实体,该方法将被视为JPA在 中persistent state,然后我更新实体中的一些字段,然后将实体传递给验证。如果验证失败,则不要更新,如果验证成功,则持久化实体。

这是此流程的主要问题:因为我更新了要在验证中使用的实体,所以无论我是否调用save(),记录都将始终更新,因为 JPA 检测到实体已更改并将其标记为更新。

如何避免这种行为?

我的实体类

@Entity
@Table( name = "user" )
@Data
@EqualsAndHashCode( of = { "id" } )
@ToString( of = { "id" } )
public class UserModel {

@Id
@GeneratedValue( strategy = GenerationType.AUTO )
@Column( name = "u_id" )
private Long id;

@Column( name = "u_first_name" )
private String firstName;

@Column( name = "u_last_name" )
private String lastName;

@Column( name = "u_email_id" )
private String emailId;

@Column( name = "u_password" )
private String password;

@Column( name = "u_mobile_number" )
private String mobileNumber;

@Column( name = "u_created_at" )
private Calendar createdAt;

@Column( name = "u_is_active" )
private Boolean isActive;
}

标签: javamysqlspring-bootspring-data-jpa

解决方案


我看到两个选项:

  1. 当验证失败时,将实体从EntityManager.

    确保使用适当的级联注释或手动迭代所有需要分离的实体。

  2. 在分离模式下进行整个更新和验证,即在没有@Transactional注释的方法中。这样,只有当您显式调用 save 时,信息才会被存储。

    这可能有点简单,但有两次加载所有受影响的实体的缺点。


推荐阅读