私はMySQLデータベースと春ブーツプロジェクトと連携し、エンティティが提供され、com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException重複エントリー
IPアドレスエンティティ、
@Entity
public class IpAddress {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "IP_ADDR_ID")
private Long id;
@Column(name = "IP_ADDRESS")
@NotEmpty
private String address;
@JsonIgnore
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "ipAddresses")
private List<HttpInfoMessage> httpInfoMessages = new ArrayList<>();
public IpAddress() {
}
public IpAddress(String address) {
this.address = address;
}
public IpAddress(String address, List<HttpInfoMessage> httpInfoMessages) {
this.address = address;
this.httpInfoMessages = httpInfoMessages;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<HttpInfoMessage> getHttpInfoMessages() {
return httpInfoMessages;
}
public void setHttpInfoMessages(List<HttpInfoMessage> httpInfoMessages) {
this.httpInfoMessages = httpInfoMessages;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof IpAddress)) return false;
IpAddress ipAddress = (IpAddress) o;
if (!getId().equals(ipAddress.getId())) return false;
return getAddress().equals(ipAddress.getAddress());
}
@Override
public int hashCode() {
int result = getId().hashCode();
result = 31 * result + getAddress().hashCode();
return result;
}
@Override
public String toString() {
return "IpAddress{" +
"id=" + id +
", address='" + address + '\'' +
'}';
}
}
のHttpメッセージエンティティ、
@Entity
public class HttpInfoMessage {
@Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "STATUS_ID")
private Long statusId;
@Column(name = "STATUS")
@NotEmpty
private String status;
public HttpInfoMessage() {
}
public HttpInfoMessage(String status) {
this.status = status;
}
public HttpInfoMessage(Long statusId, String status) {
this.statusId = statusId;
this.status = status;
}
public HttpInfoMessage(Long statusId, String status, List<IpAddress> ipAddresses) {
this.statusId = statusId;
this.status = status;
this.ipAddresses = ipAddresses;
}
public Long getStatusId() {
return statusId;
}
public void setStatusId(Long statusId) {
this.statusId = statusId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
// @ManyToMany(cascade = CascadeType.ALL, mappedBy = "httpInfoMessages")
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "IP_ADDR_STATUS",
joinColumns = @JoinColumn(name = "STATUS_ID", referencedColumnName = "STATUS_ID"),
inverseJoinColumns = @JoinColumn(name = "IP_ADDRESS_ID", referencedColumnName = "IP_ADDR_ID"))
private List<IpAddress> ipAddresses = new ArrayList<>();
public List<IpAddress> getIpAddresses() {
return ipAddresses;
}
public void setIpAddresses(List<IpAddress> ipAddresses) {
this.ipAddresses = ipAddresses;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof HttpInfoMessage)) return false;
HttpInfoMessage httpInfoMessage1 = (HttpInfoMessage) o;
if (!getStatusId().equals(httpInfoMessage1.getStatusId())) return false;
return getStatus().equals(httpInfoMessage1.getStatus());
}
@Override
public int hashCode() {
int result = getStatusId().hashCode();
result = 31 * result + getStatus().hashCode();
return result;
}
@Override
public String toString() {
return "Status{" +
"statusId=" + statusId +
", status='" + status + '\'' +
'}';
}
}
私は、テキストファイルからサーバーのログエントリを読んで、それらにいくつかの操作を行い、最終的に、私はを取得します。
私はList<IpAddress>
を取得した後、私は私がエラーを取得
、私は、それらを反復処理することにより、すべてのエントリを保存しようとしました、ちょうど示すこと
The IP list size is = 5
IP address = IpAddress{id=null, address='177.132.239.67'}
Status{statusId=403, status='403_Forbidden'}
Status{statusId=404, status='404_Not Found'}
Status{statusId=405, status='405_Method Not Allowed'}
Status{statusId=406, status='406_Not Acceptable'}
IP address = IpAddress{id=null, address='178.133.239.67'}
Status{statusId=403, status='403_Forbidden'}
Status{statusId=404, status='404_Not Found'}
Status{statusId=405, status='405_Method Not Allowed'}
Status{statusId=406, status='406_Not Acceptable'}
IP address = IpAddress{id=null, address='175.130.239.67'}
Status{statusId=403, status='403_Forbidden'}
Status{statusId=404, status='404_Not Found'}
Status{statusId=405, status='405_Method Not Allowed'}
Status{statusId=406, status='406_Not Acceptable'}
IP address = IpAddress{id=null, address='176.131.239.67'}
Status{statusId=403, status='403_Forbidden'}
Status{statusId=404, status='404_Not Found'}
Status{statusId=405, status='405_Method Not Allowed'}
Status{statusId=406, status='406_Not Acceptable'}
IP address = IpAddress{id=null, address='174.129.239.67'}
Status{statusId=403, status='403_Forbidden'}
Status{statusId=404, status='404_Not Found'}
Status{statusId=405, status='405_Method Not Allowed'}
Status{statusId=406, status='406_Not Acceptable'}
それらを印刷エントリを保存する時間、
java.lang.IllegalStateException: Failed to execute CommandLineRunner
Caused by: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '403' for key 'PRIMARY'
d
私は 'HttpInfoMessage'テーブルに' IpAddress' 'id'カラムを割り当てることで、どうやってやるのだろうと思っていますが、この問題を解決すると思います。このとき、 'Status {statusId = 403、status = '403_Forbidden'、id = 1}'、 'Status {statusId = 403、status = '403_Forbidden'、id = 2}'などのように保存され、 。私は他のより良い解決策も知っています。 – Arefe
'CascadeType.MERGE'または' CascadeType.DETACH'を使うと、 'ip_address'テーブルだけが設定されます。可能であれば、すべてのテーブルに値を設定することをお勧めします。アドバイスをお願いします – Arefe
OneToMany関係を提案します。 https://en.wikibooksを見てください。org/wiki/Java_Persistence/OneToManyを参照してください。私の場合、値は静的な値なので、列挙型の値を持つ列挙型またはデータベーステーブルを使用します –