के लिए डुप्लिकेट प्रविष्टि '...' जैसा कि आप और मैं दोनों जानते हैं, इस तरह के त्रुटि संदेशों के बारे में बहुत सारे प्रश्न हैं।कुंजी 'प्राथमिक'
लेकिन मुझे कोई अच्छा जवाब नहीं मिला क्योंकि बहुत सारे जवाब हैं।
मेरे पास क्लाइंट से भेजे गए 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 (?, ?, ?)
क्या आपने कभी यह पता लगाया कि समस्या क्या थी? जेपीए और एक अद्वितीय VARCHAR (255) कॉलम का उपयोग करके एक परियोजना में हमें एक ही समस्या है। ऐसा लगता है कि अपवाद त्रुटि संदेश केवल सूचकांक मान के पहले 64 वर्ण दिखाता है। जब हम सीधे डीबी में एक समान रिकॉर्ड डालते हैं, तो हमें कोई डुप्लिकेट कुंजी त्रुटि नहीं मिलती है। आपके मामले में "c8b4bdb84606fed0-c8b4bdb84606fed0_1352426820765_1880007534138556" 64 वर्ण लंबा भी है। लेकिन यह पूरा मूल्य नहीं है जिसे आप सम्मिलित करने का प्रयास कर रहे हैं: अंत में 402 गुम है। – tvirtualw
हमें हमारी समस्या का समाधान मिला। डिफ़ॉल्ट रूप से MySQL संयोजन केस असंवेदनशील है। हमारे टेबल में डालने के लिए हमने जो मूल्य डालने की कोशिश की थी, वही अक्षर थे और कभी-कभी वे सिर्फ एक अक्षर को अपरकेस, अन्य लोअरकेस के रूप में भिन्न होते थे। 'एबीसीडी' बनाम 'एबीसीडी' की तरह। डिफ़ॉल्ट संयोजन के साथ यह एक अद्वितीय इंडेक्स उल्लंघन का कारण बन जाएगा (मुझे प्राथमिक कुंजी के लिए भी लगता है)। हमने इसे utf8_bin में बदल दिया और फिर यह हमारे लिए काम किया। – tvirtualw
मुझे लगता है कि यूके में मानक परिभाषा से नॉन का अलग अर्थ होना चाहिए! – Strawberry