gpt4 book ai didi

java - 外键抛出 ConstraintViolationException

转载 作者:行者123 更新时间:2023-11-29 23:52:51 29 4
gpt4 key购买 nike

当我尝试使用 hibernate 进行 saveOrUpdate 时,出现 ConstraintViolationException。当我为用户插入一个全新的对象时,保存工作正常,但当我尝试更新时却失败。

在数据库表中,我有一个唯一的非空主键和一个名为 userid 的唯一非空外键

我的pojo声明如下;

@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: Duplicate entry '16' for key 'userid_UNIQUE'

数据库看起来像这样

enter image description here

我做错了什么,数据库条目不应该更新吗?

最佳答案

对于更新,您应该先加载 Card 实例,更新一些字段后,然后调用 addCardForUser 来更新它,如果 Card 实例不是通过 hibernate 加载的,hibernate 会将其识别为新记录,如果该卡有userId 与数据库中的其他卡记录相同,违反了唯一性约束!

关于java - 外键抛出 ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25524794/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com