2012-11-09 21 views
6

के लिए डुप्लिकेट प्रविष्टि '...' जैसा कि आप और मैं दोनों जानते हैं, इस तरह के त्रुटि संदेशों के बारे में बहुत सारे प्रश्न हैं।कुंजी 'प्राथमिक'

लेकिन मुझे कोई अच्छा जवाब नहीं मिला क्योंकि बहुत सारे जवाब हैं।

मेरे पास क्लाइंट से भेजे गए nonce एस संग्रहित एक टेबल है।

लेकिन कभी-कभी (कभी-कभी) डीबी डुप्लिकेट प्राथमिक कुंजी सम्मिलन के बारे में शिकायत करता है भले ही बिल्कुल वही प्राथमिक कुंजी के साथ कोई रिकॉर्ड न हो।

यहां जेएमवी दिखाता है।

[#|2012-11-09T11:06:52.098+0900|WARNING|glassfish3.1.2|javax.enterprise.system.container.ejb.com.sun.ejb.containers|_ThreadID=236;_ThreadName=Thread-2;|EJB5184:A system exception occurred during an invocation on EJB Nonce2Bean, method: public java.lang.Object kr.co.ticomms.gameground.business.AbstractEntityFacade.persist(java.lang.Object)|#] 

[#|2012-11-09T11:06:52.099+0900|WARNING|glassfish3.1.2|javax.enterprise.system.container.ejb.com.sun.ejb.containers|_ThreadID=236;_ThreadName=Thread-2;|javax.ejb.EJBException 
     ... 
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'c8b4bdb84606fed0-c8b4bdb84606fed0_1352426820765_1880007534138556' for key 'PRIMARY' 
Error Code: 1062 
Call: INSERT INTO NONCE2 (NONCE, UDID, CREATED_DATE) VALUES (?, ?, ?) 
     bind => [3 parameters bound] 
Query: InsertObjectQuery(c8b4bdb84606fed0/c8b4bdb84606fed0_1352426820765_1880007534138556402) 
     ... 
     ... 29 more 
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'c8b4bdb84606fed0-c8b4bdb84606fed0_1352426820765_1880007534138556' for key 'PRIMARY' 
Error Code: 1062 
Call: INSERT INTO NONCE2 (NONCE, UDID, CREATED_DATE) VALUES (?, ?, ?) 
     bind => [3 parameters bound] 
Query: InsertObjectQuery(c8b4bdb84606fed0/c8b4bdb84606fed0_1352426820765_1880007534138556402) 
     ... 
     ... 59 more 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'c8b4bdb84606fed0-c8b4bdb84606fed0_1352426820765_1880007534138556' for key 'PRIMARY' 
|#] 

यहां MySQL दिखाता है।

mysql> SHOW VARIABLES LIKE "%version%"; 
+-------------------------+-------------------------+ 
| Variable_name   | Value     | 
+-------------------------+-------------------------+ 
| protocol_version  | 10      | 
| version     | 5.1.62-0ubuntu0.10.04.1 | 
| version_comment   | (Ubuntu)    | 
| version_compile_machine | x86_64     | 
| version_compile_os  | debian-linux-gnu  | 
+-------------------------+-------------------------+ 
5 rows in set (0.00 sec) 

mysql> DESC NONCE2; 
+--------------+--------------+------+-----+-------------------+-------+ 
| Field  | Type   | Null | Key | Default   | Extra | 
+--------------+--------------+------+-----+-------------------+-------+ 
| CREATED_DATE | timestamp | NO |  | CURRENT_TIMESTAMP |  | 
| UDID   | varchar(255) | NO | PRI | NULL    |  | 
| NONCE  | varchar(255) | NO | PRI | NULL    |  | 
+--------------+--------------+------+-----+-------------------+-------+ 
3 rows in set (0.00 sec) 

mysql> SHOW CREATE TABLE NONCE2; 
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table                                                    | 
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| NONCE2 | CREATE TABLE `NONCE2` (
    `CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `UDID` varchar(255) NOT NULL, 
    `NONCE` varchar(255) NOT NULL, 
    PRIMARY KEY (`UDID`,`NONCE`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 | 
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| NONCE2 |   0 | PRIMARY |   1 | UDID  | A   |   7 |  NULL | NULL |  | BTREE  |   | 
| NONCE2 |   0 | PRIMARY |   2 | NONCE  | A   |   403 |  NULL | NULL |  | BTREE  |   | 
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
2 rows in set (0.00 sec) 

mysql> 

मैंने टेबल को छोड़ने और पुनर्निर्माण करने की कोशिश की लेकिन उसी तरह की समस्याएं होती हैं।

मैं ग्लासफ़िश पर जेपीए के साथ हूं।

कोई मदद?

----------------------------------------- अद्यतन

मैं जेपीए के साथ काम कर रहा हूं।

आईडी क्लास।

public class NonceId implements Serializable { 

    public static NonceId newInstance(final String udid, final String nonce) { 
     if (udid == null) { 
      throw new IllegalArgumentException("null udid"); 
     } 
     if (nonce == null) { 
      throw new IllegalArgumentException("null nonce"); 
     } 
     final NonceId instance = new NonceId(); 
     instance.udid = udid; 
     instance.nonce = nonce; 
     return instance; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 23 * hash + (this.udid != null ? this.udid.hashCode() : 0); 
     hash = 23 * hash + (this.nonce != null ? this.nonce.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final NonceId other = (NonceId) obj; 
     if ((this.udid == null) ? (other.udid != null) : !this.udid.equals(other.udid)) { 
      return false; 
     } 
     if ((this.nonce == null) ? (other.nonce != null) : !this.nonce.equals(other.nonce)) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return udid + "/" + nonce; 
    } 

    private String udid; 

    private String nonce; 
} 

इकाई वर्ग।

@Entity 
@IdClass(NonceId.class) 
@Table(name = "NONCE2") 
@XmlTransient 
public class Nonce2 implements Serializable { 

    public static final int UDID_SIZE_MIN = 1; 
    public static final int UDID_SIZE_MAX = 255; 
    public static final int NONCE_SIZE_MIN = 1; 
    public static final int NONCE_SIZE_MAX = 255; 

    public static Nonce2 newInstance(final String udid, final String nonce) { 
     if (nonce == null) { 
      throw new NullPointerException("null value"); 
     } 
     final Nonce2 instance = new Nonce2(); 
     instance.udid = udid; 
     instance.nonce = nonce; 
     return instance; 
    } 

    public Date getCreatedDate() { 
     return createdDate; 
    } 

    public String getUdid() { 
     return udid; 
    } 

    public String getNonce() { 
     return nonce; 
    } 

    @PrePersist 
    protected void _PrePersist() { 
     createdDate = new Date(); 
    } 

    @Override 
    public String toString() { 
     return udid + "/" + nonce; 
    } 

    @Column(name = "CREATED_DATE", nullable = false, updatable = false) 
    @Temporal(TemporalType.TIMESTAMP) 
    @NotNull 
    private Date createdDate; 

    @Id 
    @Column(name = "UDID", nullable = false, updatable = false) 
    @NotNull 
    @Size(min = UDID_SIZE_MIN, max = UDID_SIZE_MAX) 
    private String udid; 

    @Id 
    @Column(name = "NONCE", nullable = false, updatable = false) 
    @NotNull 
    @Size(min = NONCE_SIZE_MIN, max = NONCE_SIZE_MAX) 
    private String nonce; 
} 

और मेरे फ़िल्टर में मैं

@WebFilter(urlPatterns = {"/*"}) 
public class Filter_ implements Filter { 

    @Override 
    public void doFilter(final ServletRequest request, 
         final ServletResponse response, 
         final FilterChain chain) 
     throws IOException, ServletException { 

     // check whether nonce is already exist via em.find(); 

     chain.doFilter(request, response); 

     // store nonce via em.persist(); // EXCEPTION IS HERE 
     // THERE IS NO SUCH RECORD check direct SQL console. 
    } 
} 

मेरे जेपीए प्रदाता इस बयान पर अमल लगता है।

INSERT INTO NONCE2 (NONCE, UDID, CREATED_DATE) VALUES (?, ?, ?) 
+1

क्या आपने कभी यह पता लगाया कि समस्या क्या थी? जेपीए और एक अद्वितीय VARCHAR (255) कॉलम का उपयोग करके एक परियोजना में हमें एक ही समस्या है। ऐसा लगता है कि अपवाद त्रुटि संदेश केवल सूचकांक मान के पहले 64 वर्ण दिखाता है। जब हम सीधे डीबी में एक समान रिकॉर्ड डालते हैं, तो हमें कोई डुप्लिकेट कुंजी त्रुटि नहीं मिलती है। आपके मामले में "c8b4bdb84606fed0-c8b4bdb84606fed0_1352426820765_1880007534138556" 64 वर्ण लंबा भी है। लेकिन यह पूरा मूल्य नहीं है जिसे आप सम्मिलित करने का प्रयास कर रहे हैं: अंत में 402 गुम है। – tvirtualw

+1

हमें हमारी समस्या का समाधान मिला। डिफ़ॉल्ट रूप से MySQL संयोजन केस असंवेदनशील है। हमारे टेबल में डालने के लिए हमने जो मूल्य डालने की कोशिश की थी, वही अक्षर थे और कभी-कभी वे सिर्फ एक अक्षर को अपरकेस, अन्य लोअरकेस के रूप में भिन्न होते थे। 'एबीसीडी' बनाम 'एबीसीडी' की तरह। डिफ़ॉल्ट संयोजन के साथ यह एक अद्वितीय इंडेक्स उल्लंघन का कारण बन जाएगा (मुझे प्राथमिक कुंजी के लिए भी लगता है)। हमने इसे utf8_bin में बदल दिया और फिर यह हमारे लिए काम किया। – tvirtualw

+1

मुझे लगता है कि यूके में मानक परिभाषा से नॉन का अलग अर्थ होना चाहिए! – Strawberry

उत्तर

3

आपके पास तालिका पर परिभाषित एक समग्र प्राथमिक कुंजी है।

हो सकता है कि आप एक ही सत्र के दौरान बैच में रिकॉर्ड डालने का प्रयास कर रहे हों। और बैच में कहा गया कुंजी कॉलम के लिए डुप्लिकेट प्रविष्टियां हो सकती हैं। कृपया उस पर जांच करें।

कृपया नमूना डेटा के साथ अपना सम्मिलित कोड पोस्ट करें।

+0

शायद अपाचे-http-client का स्वचालित पुनः प्रयास फ़ंक्शन इस समस्या को बना रहा है। मैं इसमें शामिल हूं। –

संबंधित मुद्दे