【问题标题】:Disable auto update in spring data jpa在春季数据 jpa 中禁用自动更新
【发布时间】:2019-01-10 03:54:49
【问题描述】:

我有一个 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;
}

【问题讨论】:

  • 看不到你的代码(尤其是涉及到的JPA实体+事务分界相关的类),没人能帮你。
  • 你不能在实体上使用 bean 验证注释吗? baeldung.com/javax-validation
  • 你可以通过它的 id 重新加载实体...
  • 您需要自己分离实体或确保它被分离。这真的是你的错,你不应该首先修改具有潜在无效值的实体。
  • @Kayaman 我必须更新用户详细信息。如果emailId 发生更改,那么我应该将新的详细信息保存在单独的表中,否则我需要保留。为此,我必须获取实体类,然后对其进行更新。否则,我会得到重复的代码

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


【解决方案1】:

我看到两个选项:

  1. 当验证失败时,从EntityManager 中分离实体。

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

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

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

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 2016-01-30
    • 1970-01-01
    • 2013-11-12
    • 2020-08-19
    • 2020-02-20
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多