Hibernate重复键值违反异常

时间:2011-07-01 16:10:20

标签: java sql hibernate

我遇到异常:重复键值违反了唯一约束“client_pkey” Key(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,但我认为它是 我创建和保存客户的唯一地方。

  

at $ Proxy23.createClient(未知   来源)at   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(未知   源)

1 个答案:

答案 0 :(得分:0)

您不使用自动生成的ID。这意味着你必须分配它(userId,大概)。当你致电save时,它会每次都尝试插入它,你会得到一个例外。

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

请参阅此参考http://www.javabeat.net/tips/161-difference-between-hibernates-saveupdate-a.html