2017-10-11 54 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>

我得到的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對象都有一個HttpInfoMessage對象列表,它使用statusId字段作爲數據庫中的ID。一個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字段是主鍵。您的測試數據的每個IpAddressBlock中的值設置爲statusId中的值403-406。如果您從statusId中刪除這些值並將它們設置爲空,則應該可以工作。

+0

如何從'statusId'中刪除值? – Arefe

+0

您是否手動創建清單?然後您還手動設置Status.statusId上的值。否則,你必須迭代所有的狀態元素並調用某事物。比如status.setStatusId = null。 –

1

您試圖將非唯一的http狀態代碼作爲唯一的Id狀態標識。

由於您提供了實體並且無法更改它們,所以您必須確保您正確地將值作爲狀態插入。對於我這樣的實體,你可以將一個技術(生成)的id放到statusId和一個狀態的名字('403_Forbidden'或簡單的'403')到狀態欄。

相關問題