2017-04-19 24 views
1

IがばねJPAリポジトリを一意制約例外(SQLIntegrityConstraintViolationException)

を使用してOracle DBにデータを挿入しようとしている私はDBに移入する必要があるすべての値を含むハッシュマップを持って、私は、各値を反復午前私のEntityクラスに設定する 基本的に私はコンストレインプライマリキー(NotifiedToId)を持っているテーブルを持っています。値intsがコンストレイン違反例外をスローしています。私のログには、正しい値がすべて印刷されていますが、挿入されません。

My Entityクラス:

@Embeddable 
public class TbBamiNotifUserLogPK implements Serializable { 
//default serial version id, required for serializable classes. 
private static final long serialVersionUID = 1L; 

@Column(name="NOTIF_REF_NO") 
private String notifRefNo; 

@Column(name="NOTIFIED_TO_ID") 
private String notifiedToId; 

public TbBamiNotifUserLogPK() { 
} 
public String getNotifRefNo() { 
    return this.notifRefNo; 
} 
public void setNotifRefNo(String notifRefNo) { 
    this.notifRefNo = notifRefNo; 
} 
public String getNotifiedToId() { 
    return this.notifiedToId; 
} 
public void setNotifiedToId(String notifiedToId) { 
    this.notifiedToId = notifiedToId; 
} 

public boolean equals(Object other) { 
    if (this == other) { 
     return true; 
    } 
    if (!(other instanceof TbBamiNotifUserLogPK)) { 
     return false; 
    } 
    TbBamiNotifUserLogPK castOther = (TbBamiNotifUserLogPK)other; 
    return 
     this.notifRefNo.equals(castOther.notifRefNo) 
     && this.notifiedToId.equals(castOther.notifiedToId); 
} 

public int hashCode() { 
    final int prime = 31; 
    int hash = 17; 
    hash = hash * prime + this.notifRefNo.hashCode(); 
    hash = hash * prime + this.notifiedToId.hashCode(); 

    return hash; 
} 

}

import java.io.Serializable; 
import javax.persistence.*; 
@Entity 
@Table(name="TB_BAMI_NOTIF_USER_LOG") 
@NamedQuery(name="TbBamiNotifUserLog.findAll", query="SELECT t FROM  TbBamiNotifUserLog t") 
public class TbBamiNotifUserLog implements Serializable { 
private static final long serialVersionUID = 1L; 

@EmbeddedId 
private TbBamiNotifUserLogPK id; 

@Column(name="NOTIF_CAT") 
private String notifCat; 

@Column(name="NOTIFIED_TO_NAME") 
private String notifiedToName; 

@Column(name="NOTIFIED_TO_ROLE") 
private String notifiedToRole; 

public TbBamiNotifUserLog() { 
} 

public TbBamiNotifUserLogPK getId() { 
    return this.id; 
} 

public void setId(TbBamiNotifUserLogPK id) { 
    this.id = id; 
} 

public String getNotifCat() { 
    return this.notifCat; 
} 

public void setNotifCat(String notifCat) { 
    this.notifCat = notifCat; 
} 

public String getNotifiedToName() { 
    return this.notifiedToName; 
} 

public void setNotifiedToName(String notifiedToName) { 
    this.notifiedToName = notifiedToName; 
} 

public String getNotifiedToRole() { 
    return this.notifiedToRole; 
} 

public void setNotifiedToRole(String notifiedToRole) { 
    this.notifiedToRole = notifiedToRole; 
} 

}

@Entity 
@Table(name="TB_BAMI_NOTIFICATION_LOG") 
@NamedQuery(name="TbBamiNotificationLog.findAll", query="SELECT t FROM TbBamiNotificationLog t") 
public class TbBamiNotificationLog implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@Column(name="NOTIF_REF_NO") 
private String notifRefNo; 

@Column(name="\"ACTION\"") 
private String action; 

@Column(name="NOTIF_CONTENT") 
private String notifContent; 

@Column(name="NOTIF_TYPE") 
private String notifType; 

@Column(name="NOTIFIED_DATE_TIME") 
private Timestamp notifiedDateTime; 

private String refno; 

@Column(name="\"VERSION\"") 
private BigDecimal version; 

public TbBamiNotificationLog() { 
} 

public String getNotifRefNo() { 
    return this.notifRefNo; 
} 

public void setNotifRefNo(String notifRefNo) { 
    this.notifRefNo = notifRefNo; 
} 

public String getAction() { 
    return this.action; 
} 

public void setAction(String action) { 
    this.action = action; 
} 

public String getNotifContent() { 
    return this.notifContent; 
} 

public void setNotifContent(String notifContent) { 
    this.notifContent = notifContent; 
} 

public String getNotifType() { 
    return this.notifType; 
} 

public void setNotifType(String notifType) { 
    this.notifType = notifType; 
} 

public Timestamp getNotifiedDateTime() { 
    return this.notifiedDateTime; 
} 

public void setNotifiedDateTime(Timestamp notifiedDateTime) { 
    this.notifiedDateTime = notifiedDateTime; 
} 

public String getRefno() { 
    return this.refno; 
} 

public void setRefno(String refno) { 
    this.refno = refno; 
} 

public BigDecimal getVersion() { 
    return this.version; 
} 

public void setVersion(BigDecimal version) { 
    this.version = version; 
} 

}

ビジネスロジック:

 for (Entry<String, PushNotificationDetails> entry : finalTemplate.entrySet()){ 
     try{  
      notificationlog.setNotifRefNo("121323"); 
      notificationlog.setRefno(refNum); 
      notificationlog.setVersion(new BigDecimal(1)); 
      notificationlog.setAction(action); 
      LOGGER.debug("TEMPLATE TYPE"+entry.getValue().getTemplate_type()); 
      LOGGER.debug("TEMPLATE"+entry.getValue().getTemplate()); 
      notificationlog.setNotifType(entry.getValue().getTemplate_type()); 
      notificationlog.setNotifContent(entry.getValue().getTemplate()); 
      notificationlog.setNotifiedDateTime(notifiedDateTime); 
      tbBamiNotifyLogRepository.save(notificationlog); 

      LOGGER.debug("inside if block ::: "); 
      LOGGER.debug("USERID is: "+entry.getValue().getUserID()); 
      LOGGER.debug("NOTIFCAT is: "+entry.getValue().getNotif_cat()); 
      LOGGER.debug("NOTIFUSER is: "+entry.getValue().getUserName()); 
      LOGGER.debug("NOTIFROLE is: "+entry.getKey()); 
      tbBamiNotifUserLogPK.setNotifiedToId(entry.getValue().getUserID()); 
      tbBamiNotifUserLogPK.setNotifRefNo("121323"); 
      tbBamiNotifUserLog.setId(tbBamiNotifUserLogPK); 

      LOGGER.debug("GET is: "+tbBamiNotifUserLog.getId().getNotifiedToId()); 
      tbBamiNotifUserLog.setNotifCat(entry.getValue().getNotif_cat()); 
      tbBamiNotifUserLog.setNotifiedToName(entry.getValue().getUserName()); 
      tbBamiNotifUserLog.setNotifiedToRole(entry.getKey()); 
      tbBamiNotifyUserLogRepository.save(tbBamiNotifUserLog); 

     } 
+0

一意制約に違反しています。つまり、すでにDBに入っている値を挿入または更新しようとしています。同じトランザクションですべての更新を行い、トランザクションがコミットした後で制約を適用しようとする – iNan

+0

DBに値がありません。一度に1つのテーブルを挿入し、別のテーブルを挿入しなければならないと言うことを意味します。 – user7352962

+0

' notificationlog = new TbBamiNotificationLog() 'を保存' for'の先頭に追加します。 2番目の行を保存しようとすると、インスタンスが同じである可能性があります(最初の保存時にIDが指定されている)。 – StanislavL

答えて

1

はあなたのための貯蓄の初めにnotificationlog = new TbBamiNotificationLog()を追加してください。 2番目の行を保存しようとすると、インスタンスが同じである可能性があります(最初の保存時にIDが指定されている)。