【问题标题】:ConstraintViolationException thrown for Foreign Key外键抛出 ConstraintViolationException
【发布时间】:2014-08-27 10:30:06
【问题描述】:

当我尝试使用休眠模式保存或更新时,我收到了 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: 密钥“userid_UNIQUE”的重复条目“16”

数据库是这样的

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

【问题讨论】:

  • 所以你的方法“addCardForUser”实际上也更新了卡片?您是否尝试记录主键以检查您是否确实在更新主键?

标签: java mysql sql hibernate


【解决方案1】:

更新时,需要先加载 Card 实例,更新一些字段后,调用 addCardForUser 来更新它,如果 Card 实例不是通过 hibernate 加载的,hibernate 会将它识别为新记录,如果这张卡有数据库中其他卡记录的userId,违反了唯一性约束!

【讨论】:

    【解决方案2】:

    你不应该对你的外键设置一个唯一的约束。外键模拟一对多关系。虽然您的父对象可能只有 一个 用户,但同一用户可能与 许多 不同的父对象相关。因此,一个 userId 在您的父对象表中不一定只有一行。

    【讨论】:

    • 本例中的外键实际上代表了一个1:1的模型——一个用户可以拥有一张个人卡,一个用户可以拥有一张个人卡
    • @Biscuit128 如果您有 1:1 模型,那么您的两个表都可以合并
    • 是的,前几天我正在阅读,但我想尽量避免它
    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多