Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为外键引发ConstraintViolationException_Java_Mysql_Sql_Hibernate - Fatal编程技术网

Java 为外键引发ConstraintViolationException

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

当我尝试使用hibernate保存或更新时,我得到一个ConstraintViolationException。当我为一个用户插入一个全新的对象时,保存效果很好,但是当我尝试更新它时失败了

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

我的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;
}
我的插入声明如下:

@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”实际上,你也会更新卡片吗?您是否尝试记录主键以检查您是否正在实际更新主键?