Spring Jpa save() ลบคอลัมน์ออกจากเอนทิตีย่อย

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";
}

Member.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 พร้อมไฮเบอร์เนตเพื่อบันทึกหรืออัปเดตเอนทิตี CandRef โดยใช้เมธอด save() การเรียกวิธีการบันทึกจะถูกลบบนตาราง "REF_GRP_MBER" หลังจากอัปเดตในตาราง "EDJ_CANDD_REF" ในกรณีนี้ สมาชิกชุดส่วนตัว จะเป็น null เสมอ และฉันไม่เข้าใจว่าทำไมจึงพยายามลบคอลัมน์ออกจากตารางลูก

ฉันไม่ต้องการลบ/อัปเดตคอลัมน์ใดๆ ในตารางย่อยรายการใดรายการหนึ่ง ฉันลอง insertable = false, updatable = false บนข้อต่อซึ่งใช้งานไม่ได้

ใครสามารถช่วยฉันออกจากที่นี่ได้ไหม

ขอบคุณล่วงหน้า.

delete 
from
    ref_grp_mber 
where
    ref_grp_id=?

person Jai Kiran    schedule 21.11.2019    source แหล่งที่มา
comment
คุณจะต้องเพิ่มโค้ดที่คุณแก้ไขหรือสร้างเอนทิตี   -  person Alan Hay    schedule 21.11.2019
comment
ฉันแค่ใช้วิธี save(candRef) ของที่เก็บ Spring jpa   -  person Jai Kiran    schedule 21.11.2019
comment
ฉันตระหนักถึงเรื่องนั้น นั่นไม่ใช่สิ่งที่ฉันแนะนำให้คุณโพสต์   -  person Alan Hay    schedule 22.11.2019


คำตอบ (1)


และคุณจะเปลี่ยนแปลงอะไรเมื่อสิ่งนี้เกิดขึ้น? หากสมาชิกเปลี่ยนแปลง นี่เป็นพฤติกรรมเชิงตรรกะ เนื่องจากตาราง REF_GRP_MBER เก็บความสัมพันธ์กับสมาชิก และหากมีการเปลี่ยนแปลง บันทึกเก่าจะถูกลบและเพิ่มใหม่ตามการเปลี่ยนแปลง

person duck codes    schedule 21.11.2019
comment
จริงอยู่ สมาชิก null ณ จุดนี้ ดังนั้นไฮเบอร์เนตจึงคิดว่าควรลบออก แต่ฉันจะป้องกันพฤติกรรมนี้ได้อย่างไร? ฉันลอง updatable = false ใน joincolumn - person Jai Kiran; 21.11.2019