我遇到异常:重复键值违反了唯一约束“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(未知 源)
答案 0 :(得分:0)
您不使用自动生成的ID。这意味着你必须分配它(userId,大概)。当你致电save
时,它会每次都尝试插入它,你会得到一个例外。
根据您要完成的操作,您可以使用saveOrUpdate
代替save
。
请参阅此参考http://www.javabeat.net/tips/161-difference-between-hibernates-saveupdate-a.html