首页 > 解决方案 > 如何处理基于多列的春季启动更新

问题描述

我有以下用于春季启动的实体

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_idcontact_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);
}

但我不知道这是否是正确的方法?

标签: javaspring-bootspring-data-jpa

解决方案


@BenjaminMaurer 有权利,您需要从数据库中获取条目,如果未找到则保存您的条目,如果找到,则将条目中的值放入数据库中的条目并保存。在这种情况下jparepository.save(),将按照您的预期工作。

来自 DB 的条目由例如 Hibernate 管理,而您的条目可能不是。这就是为什么您需要以这种方式进行操作以及为什么jparepository.save()没有按预期工作的原因。

也许考虑在映射时从 db 获取条目(使用 AccessRepository)而不是使用new AccessContact()


推荐阅读