2011-07-01 110 views
0

我得到了异常:重复键值违反了唯一约束“client_pkey” 键(xmppid)=(xyz813 @ deweet/prototype1006)已经存在。休眠复制键值违反例外

我的配置是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,但我认为这是我 创建并保存客户的唯一场所。

在$ Proxy23.createClient(未知 来源)在 pl.samsung.cs.deweet.server.RequestHandler.onAddVirtualDevice(RequestHandler.java:182) 在 pl.samsung.cs.deweet.server .RequestHandler.handleRequests(RequestHandler.java:117) 在 pl.samsung.cs.deweet.network.impl.XmppNetContext $ $ 8 1.run(XmppNetContext.java:518) 在java.lang.Thread.run(未知 来源)

回答

0

您不使用自动生成的ID。这意味着你将不得不分配它(推测,userId)。当你打电话给save时,它会尝试每次插入它,你会得到一个异常。

根据您要完成的操作,您可以使用saveOrUpdate代替save

看到这个参考http://www.javabeat.net/tips/161-difference-between-hibernates-saveupdate-a.html

+0

感谢,我怎么可以切换到自动生成的ID?它也能解决问题吗? – michael

+0

请记住,如果您使用自动生成的值,则每次调用'save()'时都会创建新记录。您将以相同用户标识的多个记录结束。如果这真的是你想要阅读的东西http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-identifier –