Java 为外键引发ConstraintViolationException
当我尝试使用hibernate保存或更新时,我得到一个ConstraintViolationException。当我为一个用户插入一个全新的对象时,保存效果很好,但是当我尝试更新它时失败了 在数据库表中,我有一个唯一的NOTNULL主键和一个名为userid的唯一NOTNULL外键 我的pojo声明如下:Java 为外键引发ConstraintViolationException,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,当我尝试使用hibernate保存或更新时,我得到一个ConstraintViolationException。当我为一个用户插入一个全新的对象时,保存效果很好,但是当我尝试更新它时失败了 在数据库表中,我有一个唯一的NOTNULL主键和一个名为userid的唯一NOTNULL外键 我的pojo声明如下: @Id @GeneratedValue @Column(name = "id") private int id; @Column(name="userid") private int use
@Id @GeneratedValue
@Column(name = "id")
private int id;
@Column(name="userid")
private int userid;
@Column(name = "homephonenumber")
protected String homeContactNumber;
@Column(name = "mobilephonenumber")
protected String mobileContactNumber;
@Column(name = "photo")
private byte[] optionalImage;
@Column(name = "address")
private String address;
public boolean addCardForUser(String userid, Card card) {
if(StringUtilities.stringEmptyOrNull(userid)){
throw new IllegalArgumentException("Cannot add card for null or empty user id");
}
if(card == null){
throw new IllegalArgumentException("Cannot null card to the database for user " + userid);
}
SessionFactory sf = null;
Session session = null;
try{
sf = HibernateUtil.getSessionFactory();
session = sf.openSession();
session.beginTransaction();
session.saveOrUpdate(card);
session.getTransaction().commit();
return true;
}catch(Exception e){
logger.error("Unable to add Card to the database for user " + userid );
}finally{
DatabaseUtilities.closeSessionFactory(sf);
DatabaseUtilities.closeSession(session);
}
return false;
}
我的插入声明如下:
@Id @GeneratedValue
@Column(name = "id")
private int id;
@Column(name="userid")
private int userid;
@Column(name = "homephonenumber")
protected String homeContactNumber;
@Column(name = "mobilephonenumber")
protected String mobileContactNumber;
@Column(name = "photo")
private byte[] optionalImage;
@Column(name = "address")
private String address;
public boolean addCardForUser(String userid, Card card) {
if(StringUtilities.stringEmptyOrNull(userid)){
throw new IllegalArgumentException("Cannot add card for null or empty user id");
}
if(card == null){
throw new IllegalArgumentException("Cannot null card to the database for user " + userid);
}
SessionFactory sf = null;
Session session = null;
try{
sf = HibernateUtil.getSessionFactory();
session = sf.openSession();
session.beginTransaction();
session.saveOrUpdate(card);
session.getTransaction().commit();
return true;
}catch(Exception e){
logger.error("Unable to add Card to the database for user " + userid );
}finally{
DatabaseUtilities.closeSessionFactory(sf);
DatabaseUtilities.closeSession(session);
}
return false;
}
我得到的例外是
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
密钥“userid\u UNIQUE”的重复条目“16”
数据库是这样的
如果不更新数据库条目,我做错了什么?您不应该对外键设置唯一约束。外键为一对多关系建模。虽然父对象可能只有一个用户,但同一用户可能与多个不同的父对象相关。因此,对于一个用户ID,您的父对象表中不一定只有一行。要更新,您应该首先加载卡实例,在一些字段更新后,然后调用addCardForUser进行更新,如果卡实例没有通过hibernate加载,hibernate会将其重新命名为新记录,如果此卡的用户ID与数据库中的其他卡记录相同,则违反了唯一约束 这个实例中的外键实际上代表了一个1:1模型——一个用户可以拥有一张个人卡,一个用户可以拥有一张个人卡card@Biscuit128如果你有一个1:1的模型,那么你的两个表都可以合并。我前几天读到,我想尝试避免它,因为你的方法是“addCardForUser”实际上,你也会更新卡片吗?您是否尝试记录主键以检查您是否正在实际更新主键?