正如你和我都知道的那样,关于这种错误信息有很多问题.
但我找不到任何好的答案,因为答案太多了.
我有一个存储客户端发送的nonces的表.
但有时(偶尔)db会抱怨重复的主键插入,即使没有完全相同主键的记录也是如此.
@H_301_14@[#|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,?) 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' |#]
@H_301_14@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>
我尝试删除并重新创建表,但会出现同样的问题.
我在GlassFish上使用JPA.
有帮助吗?
—————————————–更新
我正在使用JPA.
ID类.
@H_301_14@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; }
实体类.
@H_301_14@@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",updatable = false) @NotNull @Size(min = UDID_SIZE_MIN,max = UDID_SIZE_MAX) private String udid; @Id @Column(name = "NONCE",updatable = false) @NotNull @Size(min = NONCE_SIZE_MIN,max = NONCE_SIZE_MAX) private String nonce; }
在我的过滤器中我做到了
@H_301_14@@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. } }
我的JPA提供程序似乎执行此语句.
@H_301_14@INSERT INTO NONCE2 (NONCE,?)
最佳答案
您在表上定义了复合主键.
原文链接:https://www.f2er.com/mysql/434042.html可能是您尝试在同一会话期间批量插入记录.并且批处理可能包含所述键列的重复条目.请检查一下.
另外,请发布带有示例数据的插入代码.