【问题标题】:Spring Jpa save() deletes columns from child entitySpring Jpa save() 从子实体中删除列
【发布时间】:2020-03-17 14:56:27
【问题描述】:

CandRef.java

@Getter
@Setter
@AllArgsConstructor
@EqualsAndHashCode
@NoArgsConstructor
@Entity
@IdClass(CandRefKey.class)
@Table(name = "EDJ_CANDD_REF")
public class CandRef implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -7171464769202238804L;

@Id
@Column(name = "EDJ_CANDD_ID")
private Integer candId;

@Id
@Column(name = "EDJ_CANDD_INST_NO")
private Integer instNo;

@Id
@Column(name = "SEQ_NO")
private Integer seqNo;

@Column(name = "EFF_BEG_DA")
private LocalDate beginDate;

@Column(name = "EFF_END_DA")
private LocalDate endDate;

@Column(name = "EDJ_RQSTN_ID")
private Integer rqstnId;

@Column(name = "RCRT_STAT_CD")
private String statCd;

@Column(name = "RCRT_STAT_DA")
private LocalDate startDate;

@Column(name = "CANDD_ORG_CD")
private String orgCd;

@Column(name = "CANDD_ORG_TYPE_CD")
private String orgTypeCd;

@Column(name = "ISO_CTRY_CD")
private String ctryCd;

@Column(name = "REF_GRP_ID")
private Integer refGrpId;

@OneToMany
@JoinTable(name = "REF_GRP_MBER", joinColumns = {
    @JoinColumn(name = "REF_GRP_ID", referencedColumnName = "REF_GRP_ID") }, inverseJoinColumns = {
        @JoinColumn(name = "REF_MBER_ID", referencedColumnName = "REF_MBER_ID") })
private Set<Member> members;

@Column(name = "REF_CNT_IND")
private String cntInd;

@Column(name = "REF_CR_IND")
private String creditInd;

@Column(name = "EDJ_CANDD_TY_CD")
private String candTyCd;

@Column(name = "REF_EXC_TY_CD")
private String excTyCd;

@Column(name = "REF_EXC_REVW_STAT_CD")
private String revwStatCd;
}

GrpMember.java

@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
@Entity
@IdClass(GrpMemberKey.class)
@Table(name = "REF_GRP_MBER")
public class GrpMember implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -6907938568490379028L;

@Id
@Column(name = "REF_GRP_ID")
private String refGrpId;

@Id
@Column(name = "REF_MBER_ID")
private Integer refMemberId;

@Column(name = "REF_CR_QTY")
private Double creditQty;

@CreationTimestamp
@Column(name = "CRE_TS", nullable = false, updatable= false)
private LocalDateTime createTimeStamp;

@Column(name = "CRE_PGM_NA", nullable = false, updatable= false)
private String createPrgmName;

@Column(name = "CRE_UID_CD", nullable = false, updatable= false)
private String createUIDCD;

@UpdateTimestamp
@Column(name = "REVSN_TS", nullable = false, insertable= false)
private LocalDateTime revisonTimeStamp;

@Column(name = "REVSN_PGM_NA", nullable = false, insertable= false)
private String revisonPrgmName ="RC_SVC";

@Column(name = "REVSN_UID_CD", nullable = false, insertable= false)
private String revisonUIDCD ="ATSWEB";
}

会员.java

@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
@Entity
@Table(name = "REF_MBER")
public class Member {

@Id
@Column(name = "REF_MBER_ID")
private Integer refMemberId;

@Column(name = "EFF_BEG_DA")
private LocalDate beginDate;

@Column(name = "EFF_END_DA")
private LocalDate endDate;

@Column(name = "REF_EDJ_PRSN_ID")
private String refPrsnId;

@Column(name = "REF_LOC_CD")
private String refLocCd;

@Column(name = "EDJ_PRSN_GROUP_CD")
private String prsnGrpCd;

@Column(name = "REF_ORG_CD")
private String orgCd;

@Column(name = "REF_ORG_TYPE_CD")
private String orgTypeCd;

@Column(name = "ORG_ONLY_REF_IND")
private String orgRefInd;

@Formula("(SELECT g.REF_CR_QTY FROM REF_GRP_MBER g WHERE g.ref_mber_id = REF_MBER_ID)")
private Double creditQty;

@CreationTimestamp
@Column(name = "CRE_TS")
private LocalDateTime createTimeStamp;

@Column(name = "CRE_PGM_NA")
private String createPrgmName;

@Column(name = "CRE_UID_CD")
private String createUIDCD;

@UpdateTimestamp
@Column(name = "REVSN_TS")
private LocalDateTime revisonTimeStamp;

@Column(name = "REVSN_PGM_NA")
private String revisonPrgmName;

@Column(name = "REVSN_UID_CD")
private String revisonUIDCD;
}

CandRefRepository.java

public interface CandidateRefRepository extends CrudRepository<CandRef, CandRefKey> {

List<CandRef> findByCandIdOrderByInstNoDesc(Integer candId);

List<CandRef> findAllByCandIdAndStatCd(Integer candId, String statCd);

@Query(value = CandidateRefConstants.CURRENT_INSTANCE_WITH_EXCEPTION)
List<CandRef> fetchCurrentInstance();

@Query(value = CandidateRefConstants.CURRENT_MAX_SEQUENCE_BY_CANDID)
CandRef fetchCurrentMaxSequence(@Param("candId") Integer candId);

@Query(value = CandidateRefConstants.CURRENT_INSTANCE_BY_STATCD)
List<CandRef> fetchCurrentInstanceBycandId(@Param("candId") Integer candId);

}

我正在使用 spring boot 和 spring jpa with hibernate 来使用 save() 方法保存或更新 CandRef 实体。 更新“EDJ_CANDD_REF”表后,保存方法调用“REF_GRP_MBER”表上的删除。现在在这种情况下,private Set members 始终为 null,我无法理解它为什么要尝试从子表中删除列。

我不想删除/更新任一子表中的任何列。我确实尝试过 insertable = false, updatable = false 在可连接件上不起作用

有人可以帮我吗?

提前致谢。

delete 
from
    ref_grp_mber 
where
    ref_grp_id=?

【问题讨论】:

  • 您需要在修改或创建实体的位置添加代码。
  • 我只是使用 Spring jpa 存储库的 save(candRef) 方法。
  • 我知道这一点。这不是我建议你应该发布的内容。

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


【解决方案1】:

当这种情况发生时,你究竟会改变什么?如果成员发生变化,那么这是一个逻辑行为,因为表 REF_GRP_MBER 存储了与成员的关系,如果成员发生变化,则删除旧记录并根据变化添加新记录

【讨论】:

  • 没错,此时成员为 null,因此 hibernate 认为应该将其删除。但是我将如何防止这种行为?我在 joincolumn 中尝试了 updateable = false
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 2017-12-11
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多