为什么session.save()会引发更新查询?

时间:2012-03-08 20:28:46

标签: hibernate sessionfactory

这是我插入两个表的代码。但它给我一个错误“批量更新从更新[0]返回意外行数;实际行数:0;预期:1”

    Session session = sessionFactory.getCurrentSession();
    ProfileDTO profile = new ProfileDTO();
    profile.setCustomerID(1);
    profile.setProfileName(profileName);
    profile.setProfileType(profileType);
    profile.setRecordId(9);
    session.save(profile);

    int profileID = profile.getRecordId();
    CustomerMeasurementsDTO measurement = new CustomerMeasurementsDTO();
    String ids[] = profileidsString.split(",");
    String vals[] = profilevalsString.split(",");
    for (int i = 0; i < ids.length ; i++){
        measurement.setMeasurementId(ids[i]);
        measurement.setMeasurementValue(vals[i]);
        measurement.setCustMeasurementsProfileId(profileID);
        session.save(measurement);
    };

执行时,它会将其用于记录目的。

Hibernate: 
    /* insert com.domain.CustomerMeasurementsDTO
        */ insert 
        into
            cust_measurements
            (cust_measurements_record_id, last_modified, measurement_id, measurement_value, measurement_record_id) 
        values
            (?, ?, ?, ?, ?)
Hibernate: 
    /* update
        com.domain.CustomerMeasurementsDTO */ update
            cust_measurements 
        set
            cust_measurements_record_id=?,
            last_modified=?,
            measurement_id=?,
            measurement_value=? 
        where
            measurement_record_id=?

我希望它在尝试更新时再次进行插入查询。我帮我错了。

3 个答案:

答案 0 :(得分:1)

CustomerMeasurementsDTO measurement = new CustomerMeasurementsDTO();放入循环中。这应该在每次循环迭代时创建一个新记录,而不是更新它。

答案 1 :(得分:0)

您创建的每个对象都必须具有不同的ID。使用session.flash()你也可以使用How to print a query string with parameter values when using Hibernate显示生成SQL的参数,这样你就可以看到传递了哪个id

答案 2 :(得分:0)

我终于找到了出路。在我的hibernate.cfg.xml中,我将“hbm2ddl.auto”的属性值设置为'create',之前是'update'。

虽然我对这方面的安全问题了解不多,但它对我来说现在很好。