2012-11-09 23 views
6

あなたと私が知っているように、この種のエラーメッセージについては非常に多くの質問があります。キー 'PRIMARY'の重複したエントリ '...'

非常に多くの回答があるので、私は良い答えが見つかりませんでした。

クライアントから送信されたnonceが格納されたテーブルがあります。

まったく同じ主キーを持つレコードがなくても、時には(時には)重複した主キーの挿入について文句を言うことがあります。

ここにJVMが表示されるものがあります。

[#|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> 

テーブルを削除して再作成しようとしましたが、同じ種類の問題が発生しました。

私はGlassFishでJPAを使っています。

助けが必要ですか?

-----------------------------------------更新

私はJPAで働いています。

IDクラス。

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. 
    } 
} 

を行う私のJPAプロバイダがこの文を実行思えます。

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

問題の内容を把握したことがありますか? JPAと一意のVARCHAR(255)列を使用するプロジェクトでも同様の問題があります。例外エラーメッセージには、インデックス値の最初の64文字のみが表示されるようです。同様のレコードをDBに直接挿入すると、キーの重複エラーは発生しません。あなたの場合、 "c8b4bdb84606fed0-c8b4bdb84606fed0_1352426820765_1880007534138556"も64文字です。しかし、挿入しようとしている完全な値ではありません。最後に402がありません。 – tvirtualw

+1

私たちは私たちの問題に対する解決策を見つけました。デフォルトでは、MySQL照合は大文字と小文字を区別しません。私たちがテーブルに挿入しようとした値は、同じ文字を持っていました。たった1文字は大文字、もう1文字は小文字に違います。 'abcd'と 'aBcd'のように。デフォルトの照合では、一意のインデックス違反が発生します(私は主キーと同じです)。 utf8_binに変更してから、私たちのために働いた。 – tvirtualw

+1

ノンスは、英国のスラングの標準定義とは異なる意味を持つ必要がありますね! – Strawberry

答えて

3

テーブルに複合主キーが定義されています。

同じセッションでバッチにレコードを挿入しようとしている可能性があります。また、バッチには、上記のキー列の重複したエントリが含まれている可能性があります。それを確認してください。

また、サンプルコードを挿入してください。

+0

apache-http-clientの自動再試行機能がこの問題を引き起こしている可能性があります。私はそれに入るよ。 –

関連する問題