2011-07-01 23 views
0

例外があります:重複キー値が一意制約 "client_pkey"に違反しています キー(xmppid)=(xyz813 @ deweet/prototype1006)は既に存在します。Hibernate重複キー値が例外に違反しました

私の設定は、Tomcat 6.0、hibernate 3.3.1、c3pO 0.9.2、またはdbcpです。

これを避ける方法はわかりません。私はそれをUniqueConstraintにして、それをトランザクションで呼び出すことがすべて唯一であるべきだと思いました。

あなたは私に間違っていることを教えてもらえますか?

@Override 
@Transactional(readOnly = false) 
public Client createClient(String userid) { 
    Client c = new Client(userid); 
    currentSession().save(c); 
    return c; 
} 

クライアントクラスは

@Entity 
@Table(name = "CLIENT", uniqueConstraints = { @UniqueConstraint(columnNames = { "xmppId" }) }) 
public class Client { 


    @Id 
    private String xmppId; 


    @Override 
    public boolean equals(Object o) { 
     Client c = (Client) o; 
     if (c.xmppId.equals(this.xmppId)) 
      return true; 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return this.xmppId.hashCode(); 
    } 

    ... 
} 

以下のように定義されたそれは、この方法に、しかし$ Proxy23.createClientを直接ポイントdoes notの私はそれが 私が作成し、クライアントを救う唯一の場所だと思います。

pl.samsung.cs.deweet.serverで pl.samsung.cs.deweet.server.RequestHandler.onAddVirtualDevice(RequestHandler.java:182)で$ Proxy23.createClient(不明 出所) で

.RequestHandler.handleRequests(RequestHandler.java:117) java.lang.Thread.runでpl.samsung.cs.deweet.network.impl.XmppNetContext $ 8 $ 1.run(XmppNetContext.java:518) (不明で ソース)

答えて

0

自動生成IDは使用しません。つまり、それを割り当てる必要があります(おそらくuserId)。 saveに電話すると、毎回それが挿入され、例外が発生します。

達成しようとしている内容に応じて、saveの代わりにsaveOrUpdateを使用できます。

この参照に http://www.javabeat.net/tips/161-difference-between-hibernates-saveupdate-a.html

+0

感謝を参照してください、どのように私は、自動生成されたIDに切り替えることができますか?それはまた問題を解決するだろうか? – michael

+0

自動生成された値を使用すると、 'save()'を呼び出すたびに新しいレコードが作成されることに注意してください。同じユーザーIDの複数のレコードで終了します。それが本当にあなたが欲しいものならここhttp://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-identifier –

関連する問題