java - 在春季数据 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;
}
解决方案
我看到两个选项:
当验证失败时,将实体从
EntityManager
.确保使用适当的级联注释或手动迭代所有需要分离的实体。
在分离模式下进行整个更新和验证,即在没有
@Transactional
注释的方法中。这样,只有当您显式调用 save 时,信息才会被存储。这可能有点简单,但有两次加载所有受影响的实体的缺点。
推荐阅读
- spring - Camunda Spring启动事务问题
- python - 打印投票分类器的类别、名称和准确度分数的问题
- .net - 是否有 .NET 函数可以将字符串解析/转换为可选值?
- r - 将文本添加到指定位置的绘图
- perl - 批处理文件到 SSH Cisco 电话并重新启动它
- css - Angular 6组件,将css应用于应用主机绑定的类?
- javascript - JS数组搜索中includes和hasOwnProperty的区别
- angular - 将命名出口路线显示为数组
- java - 仅在 apache-tomcat-9 和 Java 8 中启用 TLS 1.2
- caldav - Google CalDAV 在尝试通过“PUT”更改现有事件时收到 405