2017-10-11 13 views
0

私は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

答えて

1

各IpAddressオブジェクトには、statusIdフィールドをデータベースのIDとして使用するHttpInfoMessageオブジェクトのリストがあります。 IDは一意でなければなりません。

ただし、これらのコレクションにはCascadeType.ALLを使用します。これは、HttpInfoMessageオブジェクトも保存されることを意味します。

したがって、Status{statusId=403, status='403_Forbidden'}を保存しようとすると、IDが既に存在するため、例外が発生します。それは単純なデータベースのものであり、これを修正する必要があります。どのように、あなたが何をしたいかによって異なります。

+0

私は 'HttpInfoMessage'テーブルに' IpAddress' 'id'カラムを割り当てることで、どうやってやるのだろうと思っていますが、この問題を解決すると思います。このとき、 'Status {statusId = 403、status = '403_Forbidden'、id = 1}'、 'Status {statusId = 403、status = '403_Forbidden'、id = 2}'などのように保存され、 。私は他のより良い解決策も知っています。 – Arefe

+0

'CascadeType.MERGE'または' CascadeType.DETACH'を使うと、 'ip_address'テーブルだけが設定されます。可能であれば、すべてのテーブルに値を設定することをお勧めします。アドバイスをお願いします – Arefe

+0

OneToMany関係を提案します。 https://en.wikibooksを見てください。org/wiki/Java_Persistence/OneToManyを参照してください。私の場合、値は静的な値なので、列挙型の値を持つ列挙型またはデータベーステーブルを使用します –

1

httpService-EntityのstatusIdフィールドが主キーです。テストデータの値は、IpAddress -BlockにstatusIdに設定された値403-406です。 statusIdから値を削除し、それらをnullに設定すると正常に動作します。

+0

「statusId」から値を削除するにはどうすればよいですか? – Arefe

+0

リストを手動で作成していますか?次に、Status.statusIdの値も手動で設定します。それ以外の場合は、すべてのStatus要素を反復処理してsthを呼び出す必要があります。 status.setStatusId = nullと同じです。 –

1

一意でないIDステータスIDとして一意でないhttpステータスコードを入力しようとしています。

あなたのエンティティは提供されており、変更することはできませんので、あなたはステータスとして正しく値を挿入しています。このようなエンティティを持つ私の場合は、statusIdにステータス( '403_Forbidden'または単に '403')のステータス(status)に技術(生成)IDを入れることができます。

関連する問題