java - 如何处理基于多列的春季启动更新
问题描述
我有以下用于春季启动的实体
import org.springframework.data.domain.Persistable
@Entity
@Table
public class AccessContact implements Persistable{
@Id
@Column(name="ac_id")
long id;
@ManyToOne(cascade=CascadeType.MERGE)
@JoinColumn(name="contact_id")
Contact contact;
long reqId;
@ManyToOne(cascade=CascadeType.MERGE)
@JoinColumn(name="role_id")
Role role;
@CreatedDate
LocalDateTime createDate;
}
role_id
如果我得到相同,我想执行更新操作contact_id
,我看到有,但我认为如果我得到相同,UniqueContraints
它会出错,任何人都可以让我知道我该怎么做吗?role_id
contact_id
编辑 1: 我从 spring 存储库文档中看到isNew方法,它基本上决定实体是否是新的,所以下面是我更新的示例
@Entity
@Table
public class AccessContact{
AccessRepository accessRepo
@Id
@Column(name="ac_id")
long id;
@ManyToOne(cascade=CascadeType.MERGE)
@JoinColumn(name="contact_id")
Contact contact;
long reqId;
@ManyToOne(cascade=CascadeType.MERGE)
@JoinColumn(name="role_id")
Role role;
@CreatedDate
LocalDateTime createDate;
@Transient
public boolean isNew(){
AccessContact accessContact = accessRepo.findContactByContactAnsRole(contact, role);}
if(accessContact == null)
return true;
return false;
}
}
我的AccessRepository看起来像这样
@Repository
public interface AccessRepository extends JpaRepository<AccessContact, Long>{
public AccessContact findContactByContactAnsRole(Contact c, Role r);
}
但我不知道这是否是正确的方法?
解决方案
@BenjaminMaurer 有权利,您需要从数据库中获取条目,如果未找到则保存您的条目,如果找到,则将条目中的值放入数据库中的条目并保存。在这种情况下jparepository.save()
,将按照您的预期工作。
来自 DB 的条目由例如 Hibernate 管理,而您的条目可能不是。这就是为什么您需要以这种方式进行操作以及为什么jparepository.save()
没有按预期工作的原因。
也许考虑在映射时从 db 获取条目(使用 AccessRepository)而不是使用new AccessContact()
推荐阅读
- python - 在 Django admin 中显示内联子项
- php - 呈现错误的表单后如何重定向到页面上的位置
- c++ - 将外部库中的定义隐藏到我的代码中
- xml - 如何将元素插入子节点
- mongodb - mongodb 模型在调用函数 levelQuestion 时包含更改
- loops - SSIS foreach 循环枚举器 empty 为空 - 仅在部署时
- makefile - *.c 在依赖 xh 更改时不会反抗,使用自动生成的 *.d 文件
- tfs - Azure Devops - 是否可以防止复制或克隆工作项
- node.js - TypeError [ERR_UNESCAPED_CHARACTERS] 请求路径包含非转义字符
- css - 行跨度未在全日历中应用