As you and I both know, there are so many questions about this kind of error messages.
But I couldn't find any good answers because there are so many answers.
I have a table storing nonce
s sent from clients.
But sometimes (occasionally) db complains about duplicate primary key insertion even if there is no record with exactly the same primary key.
Here comes what JVM shows.
[#|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'
|#]
Here comes what mysql shows.
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>
I tried dropping and recreating the table but the same kind of problems occur.
I'm with JPA on GlassFish.
Any help?
----------------------------------------- UPDATE
I'm working with JPA.
ID class.
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 Class.
@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;
}
And in my Filter I do
@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.
}
}
My JPA provider seems execute this statement.
INSERT INTO NONCE2 (NONCE, UDID, CREATED_DATE) VALUES (?, ?, ?)
When creating a primary key or unique constraint after loading the data, you can get a “Duplicate entry for key 'PRIMARY'” error. If the data in the source database is valid and there are no any duplicates you should check which collation is used in your MySQL database.
1 Answer. Easiest explanation: Duplicate values are allowed but not for Primary Key attributes.
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex -> FROM person_tbl; -> GROUP BY (last_name, first_name); mysql> DROP TABLE person_tbl; mysql> ALTER TABLE tmp RENAME TO person_tbl; An easy way of removing duplicate records from a table is to add an INDEX or a PRIMARY KEY to that table.
1062 - Duplicate Entry To solve this, Set the primary key column as AUTO_INCREMENT . And when you are trying to insert a new row, ignore the primary key column or insert NULL value to primary key.
You have a composite primary key defined on the table.
May be you are trying to insert records in a batch during the same session. And the batch may be containing duplicate entries for the said key columns. Please check on that.
Also please post your insert code with sample data.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With